forgeos 0.1.0-alpha.71 → 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.
Files changed (38) hide show
  1. package/AGENTS.md +1 -1
  2. package/CHANGELOG.md +6 -0
  3. package/docs/agent-fabric-programs.md +34 -2
  4. package/docs/architecture/agent-fabric/WORKFLOW_PROGRAM_COMPETITIVE_EVIDENCE.md +75 -0
  5. package/docs/architecture/agent-fabric/WORKFLOW_PROGRAM_COMPETITIVE_PLAN.md +137 -0
  6. package/docs/architecture/agent-fabric/WORKFLOW_PROGRAM_COMPETITIVE_REVIEW.md +56 -0
  7. package/examples/agent-fabric-v2/templates/README.md +46 -0
  8. package/examples/agent-fabric-v2/templates/bugfix.json +12 -0
  9. package/examples/agent-fabric-v2/templates/migration.json +13 -0
  10. package/examples/agent-fabric-v2/templates/review.json +12 -0
  11. package/package.json +5 -1
  12. package/scripts/summarize-fabric-benchmark.mjs +6 -0
  13. package/src/forge/_generated/releaseManifest.json +1 -1
  14. package/src/forge/_generated/releaseManifest.ts +3 -3
  15. package/src/forge/agent-fabric/claude-program-worker.ts +95 -0
  16. package/src/forge/agent-fabric/codex-sdk-worker.ts +10 -4
  17. package/src/forge/agent-fabric/index.ts +5 -0
  18. package/src/forge/agent-fabric/local-task-server.ts +2 -1
  19. package/src/forge/agent-fabric/managed-environment.ts +14 -8
  20. package/src/forge/agent-fabric/managed-workspace.ts +4 -0
  21. package/src/forge/agent-fabric/program-api.ts +1 -1
  22. package/src/forge/agent-fabric/program-authoring.ts +48 -0
  23. package/src/forge/agent-fabric/program-benchmark.ts +76 -0
  24. package/src/forge/agent-fabric/program-capabilities.ts +14 -0
  25. package/src/forge/agent-fabric/program-contract.ts +19 -3
  26. package/src/forge/agent-fabric/program-observation.ts +63 -0
  27. package/src/forge/agent-fabric/program-runtime-options.ts +23 -0
  28. package/src/forge/agent-fabric/program-scheduler.ts +25 -6
  29. package/src/forge/agent-fabric/program-service.ts +172 -35
  30. package/src/forge/agent-fabric/program-store.ts +9 -1
  31. package/src/forge/agent-fabric/program-templates.ts +96 -0
  32. package/src/forge/agent-fabric/program-view.ts +15 -1
  33. package/src/forge/agent-fabric/program-worker.ts +73 -20
  34. package/src/forge/agent-memory/mcp.ts +8 -2
  35. package/src/forge/cli/fabric.ts +4 -2
  36. package/src/forge/cli/main.ts +2 -0
  37. package/src/forge/cli/parse.ts +3 -1
  38. package/src/forge/version.ts +1 -1
package/AGENTS.md CHANGED
@@ -1,4 +1,4 @@
1
- // @forge-generated generator=0.1.0-alpha.71 input=c1757bb141bbcdd4d235a6d1af230b3a767ec7e4354f7fc3afb49fd46e893f06 content=721818a6f9a664aa898092d4aa5cd68cbbd8ad6e150c7d3ad3ef785a2e3fcf53
1
+ // @forge-generated generator=0.1.0-alpha.72 input=4096e19589f57b9568accde0ae34aa0782c1598f54261e161e1ff5ac7cc857b9 content=721818a6f9a664aa898092d4aa5cd68cbbd8ad6e150c7d3ad3ef785a2e3fcf53
2
2
  # AGENTS.md
3
3
 
4
4
  <!-- forge-generated:start -->
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # forgeos
2
2
 
3
+ ## 0.1.0-alpha.72
4
+
5
+ ### Patch Changes
6
+
7
+ - Add owner-bound workflow authoring templates, durable usage budgets, fair scheduling, compatible recovery, conflict resolution and optional Claude adapter. Harden approval, evidence, accounting, Unicode transport and MCP interfaces; add paired benchmark reporting and focused CI coverage. Real-provider smoke and competitive quality evaluation remain unperformed.
8
+
3
9
  ## 0.1.0-alpha.71
4
10
 
5
11
  ### Patch Changes
@@ -136,7 +136,7 @@ Barrier replan recomputes changed branches and dependents, preserving compatible
136
136
 
137
137
  Owner contracts declare `requiredChecksByScope:{item,final}`, `assessmentBindings` and obligations `{id,scope,criteria,requiredEvidence?}`. Review/check/capture receive AssessmentContext with candidateRef, obligationIds, environmentRef, itemKey and evidenceRefs. Evidence files are readonly inputs. Registered capture commands return JSON `evidenceArtifacts:[{path,itemKey,buildDigest,environmentRef,mime,width,height,route,viewport,state}]`; path must be in bounded scratch storage. Owner stores immutable bytes and issues capture receipts. Invalid/missing/stale evidence blocks; it does not become a UI defect requiring implementation.
138
138
 
139
- Assess-first means a correct UI produces zero edits. Review approval alone is insufficient: findings must be empty, checks passed, all obligations covered, current candidate/env/evidence bound and distinct observed reviewer attempt. Final assessment after compose recaptures the complete population and can reject an item previously approved locally. Conflicts need resolution; no automatic resolution recipe is implemented.
139
+ Assess-first means a correct UI produces zero edits. Review approval alone is insufficient: findings must be empty, checks passed, all obligations covered, current candidate/env/evidence bound and distinct observed reviewer attempt. Final assessment after compose recaptures the complete population and can reject an item previously approved locally. Compose can opt into an owner-registered resolver; conflicting artifacts are data for resolution rather than simultaneously materialized. The resolver starts from the baseline, produces a fresh candidate and inherits no approval. A new final assessment is required.
140
140
 
141
141
  Map keys normalize NFC before uniqueness, encode path segments once and order by UTF-8. Completion is all-required/partial/quorum; quorum is `{minAccepted:K}`, explicit and only closes when outcomes settle. Owner must authorize partial/quorum; such a result cannot alone satisfy all-required final obligations. Envelope item outcome is distinct from arbitrary user data (including a user field named status).
142
142
 
@@ -148,4 +148,36 @@ Apply commits an immutable intent before the first write, pins candidate/contrac
148
148
 
149
149
  `examples/agent-fabric-v2/ui-audit.workflow.ts` is the complete UI plan. `run-ui-fixture.ts` builds 20 local HTML pages with three known defects and registered deterministic discover/capture/review/implement/local/global-check commands. Test evidence: exactly three implementations, 43 captures including 20 fresh final captures, 21 final obligations, no apply and zero LLM calls. PNG fixtures verify transport/binding. Optional explicit browser path renders local HTML in headless Chromium/Edge; visual quality is still not model-evaluated.
150
150
 
151
- Run `FORGE_FABRIC_TEST_MODE=1` using the shell's environment syntax, then `node bin/forge-bun.mjs run examples/agent-fabric-v2/run-ui-fixture.ts`. The test fuse refuses default real Codex factories; stubs remain supported. Runtime profiling: `node bin/forge-bun.mjs run scripts/benchmark-fabric-workflows.ts report.json`, fixed fan-out/fault/restart, no provider. Neither is a Claude/model-quality benchmark. Future extensions (cross-run cache, distributed owner, automatic GC/resolution, unlimited streaming/race, additional harnesses) remain out of this implementation.
151
+ Run `FORGE_FABRIC_TEST_MODE=1` using the shell's environment syntax, then `node bin/forge-bun.mjs run examples/agent-fabric-v2/run-ui-fixture.ts`. The test fuse refuses default real model factories; stubs remain supported. Runtime profiling: `node bin/forge-bun.mjs run scripts/benchmark-fabric-workflows.ts report.json`, fixed fan-out/fault/restart, no provider. Neither is a Claude/model-quality benchmark. Cross-run cache, distributed owner, automatic GC and unlimited streaming/race remain future extensions.
152
+
153
+ ## Competitive workflow program
154
+
155
+ The detailed implementation plan is `architecture/agent-fabric/WORKFLOW_PROGRAM_COMPETITIVE_PLAN.md`. Owner-bound review, bugfix and migration authoring requests are in `examples/agent-fabric-v2/templates/`. `program-author --file request.json` proposes validated IR; `program-author-types` reads declarations generated from the owner registry. Both use the authenticated owner and dispatch no worker. Start and apply remain separate.
156
+
157
+ The owner reads optional `.forge/fabric-runtime.json` at startup:
158
+
159
+ ```json
160
+ {"schemaVersion":1,"ownerCapacity":4,"ownerMaxTokens":100000}
161
+ ```
162
+
163
+ Capacity accepts 1–32. Omit `ownerMaxTokens` to leave the owner token budget unspecified. Configuration is a regular bounded file, not a request override; changes take effect on explicit owner restart. Existing `ensure-owner` starts or reuses the detached local owner. No global service installation is required. Restart preserves uncertain attempts and does not automatically resume paused work.
164
+
165
+ The owner token budget is cumulative across runs retained in its store, including unspent final reservations. It has no implicit daily reset and is not a monetary budget. Preparation may happen before admission; these counters do not price CPU or storage. Settled unknown provider usage requires the declared allowance or an authenticated `program-reconcile` request with `resolution: "usage"`, observed counters, authorization provenance and a reason. Observed usage cannot be silently overwritten.
166
+
167
+ A policy may declare `resources: {maxTokens, reserveTokensPerAttempt, finalReserveTokens, unknownUsage: "block" | "allow"}`. These are durable admission budgets, not provider hard limits. In-flight work can exceed estimates. Unknown consumption is explicit and cannot be represented as measured zero. An owner-declared nonprovider command can use `tokenAccounting: "none"`; its usage is `not-applicable`, rather than measured zero. Arbitrary commands remain unknown without this declaration. Required final checks and review are never waived to fit a budget. `program-explain` reports usage liability, scheduler capacity, storage deduplication and actionable diagnostics. Observations are bounded, deduplicated and persisted before final schema validation; candidate acceptance still depends on owner receipts.
168
+
169
+ Program model workers prepare existing repository context from their current clone and record context diagnostics. Codex can receive native local images with delivery receipts; delivery does not prove comprehension. Codex thread recovery requires observed termination, the original workspace and compatible invocation. Reconcile explicitly before resuming; do not retry uncertain effects blindly.
170
+
171
+ The opt-in `kind: "claude"` executor requires one explicit native executable in `argv`, `isolation: "cooperative"`, `network: "host"` and owner policy allowing both. Its stream-JSON adapter uses structured output and restricted tools, disables inherited hooks/MCP, records usage including failed results, and checks session identity. It requires a CLI compatible with the documented flags (minimum indicated 2.1.259). This integration has deterministic protocol coverage; no real Claude smoke or quality comparison has been performed. Claude provides neither strong isolation nor observed process-tree termination here; native image delivery and workspace thread recovery are currently Codex capabilities.
172
+
173
+ Independent coding quality and competitive superiority require external evaluation. `scripts/summarize-fabric-benchmark.mjs` validates collected reports and keeps missing usage or independent assessment explicit. Deterministic runtime tests do not establish superiority over Claude Code.
174
+
175
+ ### Corrections from implementation review
176
+
177
+ Templates requiring human approval must supply an owner-registered `approvalSchema` accepting an object with `approved: true`. The template emits a bound wait event and passes its output to the gate. `evidence` accepts readonly owner-registered executors. Capture obligations currently require the population migration template with evidence executors; review/bugfix convenience templates reject that profile before dispatch. Custom workflow IR remains available for broader UI assessment flows. Template scopes must fit acceptance, policy and executor permissions; resolver scope must cover every proposed file.
178
+
179
+ Trusted hosts may call `ProgramRunService.updateRuntimeOptions` to resize activity capacity without interrupting active attempts. File configuration remains startup/restart configuration. Completed publication may receive usage reconciliation, but does not reopen its gate or become resumable.
180
+
181
+ Recovery now binds the delivered repository context, supplementary runtime observations and evidence bytes to the invocation fingerprint. Older markers that lack this binding are conservatively incompatible; do not rewrite them to bypass reconciliation. Preparation observations separate workspace, environment, cache verification/copy, dependency installation, capture and execution timings. Nested phase durations must not be summed as independent wall time.
182
+
183
+ For paired external reports, use `node --import tsx scripts/summarize-fabric-benchmark.mjs LEFT.json RIGHT.json`. Comparison validates matching tasks, model, tools, context, contract and budget; unmatched inputs cannot establish controlled superiority. Missing metrics remain unknown. CI also verifies that each critical gate actually produces a passing test result.
@@ -0,0 +1,75 @@
1
+ # Forge Agent Fabric — implementação e evidências
2
+
3
+ Data: 2026-10-10. Baseline: `3e7475f7a0e47be0d351d5c37355ed9f3a5c0ecd`.
4
+ Plano: `WORKFLOW_PROGRAM_COMPETITIVE_PLAN.md`. Entrega local sem commit, push, publicação ou deployment.
5
+
6
+ ## Entrega por etapa
7
+
8
+ | Etapa | Implementação | Evidência e limite |
9
+ |---|---|---|
10
+ | E0 | Relatório versionado de benchmark, validação e resumo com avaliação independente | Unknown não vira zero; aprovação do owner não prova sucesso externo. Nenhum benchmark de qualidade com provedor foi realizado. |
11
+ | E1 | Observações duráveis, deduplicação, semântica incremental/cumulativa, usage em falhas, diagnóstico estruturado | Teste de output inválido preserva consumo após restart; contadores inválidos/overflow bloqueiam. Não aplicável é distinto de medição zero. |
12
+ | E2 | Round-robin e capacidade owner configurável de 1 a 32 | Três runs elegíveis alternam; regressão T07 identificou e corrigiu cursor quando novas filas chegam. |
13
+ | E3 | Reconciliação explícita e retomada Codex com workspace original, término observado, geração e fingerprint | Serviço encaminha thread compatível; fixture Git com preparação real rejeita delta incompatível e marker adulterado antes de iniciar modelo. |
14
+ | E4 | Autoria pelo owner, declarações tipadas e templates review/bugfix/migration | Três templates executam até acceptance-ready com checks/gate; baseline correto gera zero implementação. Revisão negativa não edita nem aprova. |
15
+ | E5 | Contexto existente do repositório integrado ao clone dos program workers | Snapshot/diagnósticos registrados; qualidade do código gerado com esse contexto não foi medida. |
16
+ | E6 | Admissão serializada, reservas duráveis por run/owner e reserva final | Testes de restart, input forjado e orçamento entre runs. Uso real informado prevalece sobre declaração de comando sem provedor. |
17
+ | E7 | Preparação instrumentada e CAS deduplicado antes de escrita/fsync | Duplicata não aumenta bytesWritten; conteúdo corrompido continua rejeitado. Não há alegação de ganho geral de latência. Cache existente de dependências foi preservado. |
18
+ | E8 | Resolver autorizado, candidato novo e recibo causal de substituição | População fechada requer nova avaliação, obrigações de cada item e união de checks. Recibo vincula geração, semântica, contrato e população; relógio não autoriza reaproveitamento. |
19
+ | E9 | Adapter Claude opt-in, validação de versão, reutilização do owner background existente e imagens nativas Codex | Protocolo simulado e transporte de imagem verificados. Claude real não foi executado; adapter cooperativo, rede do host, sem término garantido da árvore. |
20
+
21
+ ## Módulos e interfaces
22
+
23
+ - Runtime: `program-contract`, `program-service`, `program-scheduler`, `program-store`, `program-observation` e `program-view`.
24
+ - Workers: `program-worker`, `codex-sdk-worker`, `claude-program-worker`, observação de `managed-workspace` e contexto existente do repositório.
25
+ - Autoria: `program-authoring`, `program-templates`, opções compose no `program-api` e exemplos em `examples/agent-fabric-v2/templates/`.
26
+ - Interfaces: ações `program-author` e `program-author-types` em CLI/MCP/owner, configuração regular e limitada `.forge/fabric-runtime.json`, capabilities compartilhadas e exports públicos.
27
+ - Avaliação: `program-benchmark` e `scripts/summarize-fabric-benchmark.mjs`; apenas validam relatórios previamente coletados.
28
+
29
+ ## Validação concluída
30
+
31
+ Foram usadas suítes direcionadas, sem executar modelos reais. Os números abaixo descrevem grupos de verificações; algumas rodadas repetiram somente casos afetados por correções e não devem ser somadas como testes únicos.
32
+
33
+ | Grupo | Resultado |
34
+ |---|---|
35
+ | SDK, autoria, configuração pública e templates | 21 testes passaram; 125 assertions na primeira integração |
36
+ | Adapter Claude, imagens e recuperação com Git real | 3 testes passaram; 22 assertions; 1,71 s na integração final |
37
+ | Runtime competitivo e execução de templates por ações do owner | 10 testes passaram; 69 assertions; 11,85 s na integração final |
38
+ | Gates críticos existentes selecionados | 4 passaram; 40 filtrados; nenhum erro |
39
+ | Contrato e classificador de CI | 2 passaram; caminhos centrais e desconhecidos preservam suíte ampla |
40
+ | Regressões selecionadas após correção do scheduler | 16 passaram; 23 filtradas; 15,11 s |
41
+ | Typecheck global | `node node_modules/typescript/bin/tsc --noEmit`: exit 0 |
42
+ | Lint e whitespace | Lint aprovado; `git diff --check`: exit 0 |
43
+ | Geração/export dos adapters | Geração e exports generic/codex aprovados |
44
+ | `verify framework --skip-tests --skip-typecheck` | Aprovado: estabilidade da geração, contrato, compiler workspace, policy, auth, RLS estrutural, adapters e lint |
45
+
46
+ A verificação framework omitiu deliberadamente a suíte completa e a repetição do typecheck, pois os testes selecionados e o typecheck foram executados separadamente. Não se declara aprovação da suíte completa. Uma rodada anterior de regressões foi interrompida após 59 aprovações ao revelar bloqueio no scheduler; o cursor foi corrigido e o caso afetado passou na seleção posterior. O aviso estrutural existente de RLS em pglite/memory não comprova isolamento em PostgreSQL.
47
+
48
+ ## CI reduzida
49
+
50
+ Ubuntu/Node 22 roda uma vez no job verify. A matriz adicional usa Windows 22 em PRs, Windows 22 e Ubuntu 24 no main, e inclui macOS no disparo manual. Typecheck, geração estável, compiler checks, lint e segurança permanecem.
51
+
52
+ Somente mudanças em módulos explicitamente cobertos de autoria/templates/observação/benchmark/view/Claude e seus testes selecionam a suíte crítica. Alterações em owner, lease, store, workspace, serviços, dependências, arquivos compartilhados, caminhos desconhecidos ou histórico ausente mantêm cobertura ampla. Main mantém a suíte completa de Agent Fabric. Nenhum teste existente foi removido ou assertion enfraquecida. O tempo total do GitHub Actions não foi medido e a nova configuração ainda não foi executada no GitHub.
53
+
54
+ ## Correções da revisão independente
55
+
56
+ 1. Comandos sem provedor usam declaração explícita do owner `tokenAccounting: "none"` e estado não aplicável; comandos arbitrários continuam desconhecidos. Uso informado inesperadamente é contabilizado.
57
+ 2. Resolver não herda aprovação dos itens: recibo causal permite substituir a proveniência original, com nova avaliação completa e checks de item/final.
58
+ 3. Freshness usa IDs dos recibos emitidos pelo owner, evitando reaproveitamento baseado em timestamps iguais ou relógio regressivo.
59
+ 4. CI reduzida foi restringida para preservar regressões dos módulos centrais.
60
+ 5. Recuperação foi exercitada com workspace/marker reais, além do encaminhamento simulado da thread.
61
+
62
+ A revisão daquela rodada não encontrou bloqueadores adicionais no conjunto examinado. A revisão cruzada posterior encontrou e corrigiu bugs adicionais de recuperação, accounting, scopes, aprovação/evidências, Unicode, MCP e CI; veja `WORKFLOW_PROGRAM_COMPETITIVE_REVIEW.md` para os resultados atualizados e limites. Revisão estática e fixtures locais não certificam produção.
63
+
64
+ ## Condições de operação e pendências externas
65
+
66
+ - OwnerMaxTokens é cumulativo sobre runs retidos e reservas finais; não se renova diariamente. É orçamento de admissão por tokens, sem preço de CPU/storage ou garantia de teto monetário.
67
+ - Trabalho em curso pode exceder a estimativa reservada; término desconhecido mantém reservas e exige reconciliação.
68
+ - Claude requer executável nativo compatível, versão >=2.1.259 e política cooperativa/rede explícita. A consulta de versão acontece antes de inferência no uso futuro; não foi executada nesta sessão.
69
+ - Retomada no workspace original e imagens nativas estão habilitadas para Codex. Claude não recebe essas garantias neste adapter.
70
+ - Imagem entregue não significa imagem compreendida. Protocolo simulado não demonstra qualidade de programação.
71
+ - Owner background reutiliza o startup local existente; nenhum serviço global foi instalado e nenhum owner permanente foi iniciado nesta entrega.
72
+ - Snapshot incremental, GC destrutivo, cache de respostas entre runs e owner distribuído continuam extensões condicionais, conforme o plano.
73
+ - G4–G6 — qualidade externa, eficiência representativa e superioridade competitiva — exigem avaliação posterior. Não são inferidos dos testes locais.
74
+
75
+ Os artefatos gerados foram atualizados pelo gerador, sem edição manual. Arquivos não rastreados preexistentes foram preservados. Alterações permanecem no checkout para revisão.
@@ -0,0 +1,137 @@
1
+ # Forge Agent Fabric — plano técnico final
2
+
3
+ Data: 2026-10-10. Baseline: `3e7475f7a0e47be0d351d5c37355ed9f3a5c0ecd`.
4
+ Escopo autorizado: implementação local completa com subagentes, validação focada e redução de redundâncias na CI. Nenhuma publicação, push, deployment ou instalação global faz parte desta entrega. Este plano não autoriza inferência paga para benchmarks.
5
+
6
+ ## Objetivo e critérios de sucesso
7
+
8
+ Evoluir `program-*` para workflows de programação completos, observáveis, recuperáveis e eficientes. Superioridade competitiva exige qualidade externa, tempo e consumo por resultado correto, trabalho repetido após falha e intervenções humanas; aprovação do próprio gate não é a definição de sucesso. Comparações precisam declarar modelos, ferramentas, contexto, versões e budgets.
9
+
10
+ O baseline já contém DSL finita/IR v2, schemas e tipos nominais, owner exclusivo, gates, aplicação separada, templates básicos, contexto de repositório em `run-*`, cache verificado de dependências, journal encadeado e artefatos por conteúdo. Não reconstruir esses mecanismos.
11
+
12
+ ## Invariantes
13
+
14
+ - Modelo propõe; owner valida registry, autoridade, escopo e aceitação.
15
+ - Completed não significa accepted. Review/checks/evidence/coverage pertencem ao candidato observado.
16
+ - Cancelamento solicitado não comprova término da árvore de processos.
17
+ - Efeitos não observados continuam uncertain; não há exactly-once externo.
18
+ - Resume não repõe débitos nem estende deadlines.
19
+ - Apply continua separado e vinculado ao gate atual; múltiplos arquivos não formam transação atômica.
20
+ - Eventos tardios não concluem gerações sucessoras.
21
+ - Telemetria distingue observado, estimado e desconhecido; desconhecido nunca é zero.
22
+ - Mudanças de semântica/persistência são versionadas; não reinterpretar checkpoints antigos silenciosamente.
23
+ - Command e adapters cooperativos não são sandbox forte.
24
+
25
+ ## Entregas, prioridade e dependências
26
+
27
+ | ID | Prioridade | Entrega | Depende de |
28
+ |---|---|---|---|
29
+ | E0 | P0 | Baseline e protocolo de avaliação externa | — |
30
+ | E1 | P0 | Telemetria durável e diagnóstico | definições E0 |
31
+ | E2 | P0 | Round-robin real e capacidade owner configurável | E0/E1 para liberação |
32
+ | E3 | P0 | Cancelamento, reconciliação e recuperação segura | E1 |
33
+ | E4 | P0 | Review, bugfix e migration completos; autoria assistida | E1/E3 |
34
+ | E5 | P1 | Contexto existente em program workers | E0/E1 |
35
+ | E6 | P1 | Orçamento de admissão e reservas | E1/E2/E3 |
36
+ | E7 | P1 | Eficiência de preparação/persistência | profiling E0/E1, invariantes E3 |
37
+ | E8 | P1 | Resolução de conflitos e replan assistido | E3/E4 |
38
+ | E9 | P2 | Harness adicional, owner background e multimodalidade | gates específicos |
39
+
40
+ ## E0 — baseline e avaliação
41
+
42
+ Separar workloads determinísticos (runtime) de tarefas de programação (qualidade externa). Registrar configuração, versão, workload, modelo, ambiente e fontes. Medir fila, preparo, execução, captura, persistência, integração, tokens, consumo desconhecido, bytes, sucesso externo, regressões e intervenção humana. Relatório recusa tratar acceptance do próprio owner como sucesso externo.
43
+
44
+ Aceite: relatórios validados, campos ausentes explícitos, condições comparáveis declaradas e métricas de sucesso definidas antes da avaliação. Benchmarks reais ficam pendentes de execução explicitamente autorizada; fixtures demonstram apenas seus contratos.
45
+
46
+ ## E1 — telemetria
47
+
48
+ Normalizar observações de lifecycle e usage com identidade, sequência, origem, unidade e semântica delta/cumulative. Persistir usage antes de validar output final. Preservar observações em falhas e restart; deduplicar. Armazenar detalhes limitados sem credentials nem transcripts ilimitados. Expor status/explain compartilhados CLI/MCP com motivos e ações possíveis.
49
+
50
+ Módulos: `codex-sdk-worker`, `program-worker`, `program-contract`, `program-service`, `program-store`, `program-view`; interfaces públicas CLI/MCP.
51
+
52
+ Aceite: output inválido não apaga usage observado; duplicatas não somam duas vezes; unknown não é zero; eventos antigos não aprovam sucessor; razões de bloqueio são estruturadas. Telemetria não cria escrita de snapshot por mensagem token a token.
53
+
54
+ ## E2 — scheduling
55
+
56
+ Filas por run e round-robin explícito entre runs elegíveis. Config owner validada (default quatro, teto inicial existente 32), run e ancestor scopes. Alteração para capacidade menor impede novas admissões sem matar atividades. Reservas uncertain permanecem ativas.
57
+
58
+ Módulos: `program-scheduler`, `program-service`, `program-contract`, `program-view`.
59
+
60
+ Aceite: >=3 runs continuamente admissíveis recebem atendimento; quotas respeitadas; parent controls não ocupam slots; release idempotente; cancelamento não vaza slots. Usar barreiras determinísticas, não assertions de throughput baseadas em sleeps curtos.
61
+
62
+ ## E3 — continuidade
63
+
64
+ Observar processo/thread/workspace/candidato antes de decidir reutilização, resume thread, nova tentativa ou reconcile. SDK já suporta resume; program adapter deve recebê-lo apenas com workspace original compatível e efeitos verificados. Registrar checkpoints e observações, preservar deltas parciais e owners epochs. Expor reconciliação assistida com fatos e desconhecidos.
65
+
66
+ Módulos: `program-worker`, `codex-sdk-worker`, `managed-workspace`, `program-service`, `program-contract`, `program-store`, `program-owner`, `program-lock`, `program-view`.
67
+
68
+ Aceite: sem redispatch incerto/escritor duplicado; intactos independentes reutilizados; prazos/budgets preservados; workspace incompatível bloqueia resume; callbacks tardios não alteram sucessor. Não prometer cancelamento de árvore sem adapter capaz de observar essa garantia.
69
+
70
+ ## E4 — autoria e workflows
71
+
72
+ Três templates owner-validated: revisão sem alteração, bugfix limitado, migration por população fechada. Entrada natural do agente produz proposta de template/IR; proposta não substitui registry. Schemas, scopes, checks, review e parada explícitos. Gerar refs tipadas a partir do registry. Explicar erros por operação/campo e distinguir completion/acceptance/apply. Aproveitar DSL finita e exemplos existentes; não criar interpretador geral.
73
+
74
+ Módulos: `program-api`, `program-dsl`, `program-types`, `program-structure`, módulos de authoring/templates, `program-view`, CLI/MCP e exemplos.
75
+
76
+ Aceite: proposta válida contém refs/criteria/checks/scopes/limites; checks obrigatórios não podem desaparecer; caso correto não exige edits; alteração invalida review incompatível; workflows executam com fixtures sem LLM.
77
+
78
+ ## E5 — contexto
79
+
80
+ Integrar `prepareFabricRepositoryContext` existente ao clone/candidato de programas. Selecionar símbolos, contratos, dependências, checks sugeridos e lacunas por papel/atividade. Contexto limitado e identificado por snapshot; checks sugeridos não executam implicitamente. Ausência de manifesto segue diagnóstico/política explícita.
81
+
82
+ Aceite: clone atual e contexto correspondem; mudanças revalidam; truncamento explícito; melhoria de qualidade ou eficiência deve ser medida, não inferida de tamanho menor do prompt.
83
+
84
+ ## E6 — recursos
85
+
86
+ Ledger observado/reservado/estimado/desconhecido, tokens por run/owner, reservas para atividades e avaliação final. Serializar admissão agregada sob owner exclusivo, reservas duráveis associadas à tentativa. Reinício reconstrói saldo/reservas. Monetary reporting somente com modalidade/pricing declarados; subscription não vira dólar fictício. Hard enforcement somente conforme capability do adapter; demais perfis têm admission budget e overshoot possível de trabalho em curso.
87
+
88
+ Módulos: `program-contract`, `program-service`, `program-scheduler`, `program-store`, `program-worker`, `program-view`.
89
+
90
+ Aceite: admissões não gastam o mesmo saldo; restart não repõe; unknown policy explícita; atingir limite preserva resultados e bloqueia novos dispatches; revisão/checks conservam reserva. Não transformar orçamento em licença para omitir obrigações.
91
+
92
+ ## E7 — eficiência
93
+
94
+ Instrumentar cache hit/verificação/cópia/instalação; materialização de workspace; serialização/validação/fsync/bytes. Aplicar melhorias locais que evitem trabalho redundante comprovado. Cache existente permanece verificado; mutable trees não são compartilhadas. Snapshot incremental, GC e cache de respostas LLM são extensões condicionais ao profiling e não obrigatórias sem gargalo demonstrado.
95
+
96
+ Aceite: ganho demonstrado em workload definido; cache corrupto bloqueia; isolamento, histórico e recuperação permanecem íntegros; artefatos ligados a apply uncertain preservados.
97
+
98
+ ## E8 — conflitos e adaptação
99
+
100
+ Resolver recebe baseline, candidatos conflitantes e contrato e produz novo candidato, sem aprovação herdada. Requer nova avaliação final. Replan propõe delta sem enfraquecer obrigações; preserva branches intactos. Repetição sem progresso termina explicitamente.
101
+
102
+ Módulos: `program-service`, contratos/types/structure, worker/workspace, templates/view.
103
+
104
+ Aceite: conflito não vira approval automático; candidato integrado reavaliado; checks/obligations mantidos; late callbacks fenced. Fencing local e novos operadores só entram por necessidade demonstrada.
105
+
106
+ ## E9 — expansão opt-in
107
+
108
+ - Segundo harness nativo: schema, identidade, usage, término, cancelamento, isolamento, retomada e late callbacks conformes. CLI externa via command não basta. Adapter Claude explícito com capabilities honestas, sem bypass automático nem inferência real nesta validação.
109
+ - Owner background local: preservar IPC autenticado, lease e recovery; pausar/uncertain não retomam implicitamente. Reutilizar startup existente, sem instalar serviço global silenciosamente.
110
+ - Multimodal: imagem explicitamente entregue pelo adapter, provenance vinculada; receipts não demonstram compreensão. UI exige avaliação integrada final e cobertura do catálogo.
111
+
112
+ ## Mudanças por módulo
113
+
114
+ | Módulo | Mudança |
115
+ |---|---|
116
+ | program-contract/service | observações, admissão, recovery, compose resolver |
117
+ | program-scheduler | fairness/capacidade/quota |
118
+ | program-store | observações duráveis e métricas; preservação CAS |
119
+ | program-worker/codex-sdk-worker | lifecycle/usage/context/resume/multimodal |
120
+ | managed-environment/workspace | profiling/materialização/compatibilidade |
121
+ | repository-context | contexto por candidato |
122
+ | program-api/dsl/types/structure | autoria e refs typed; resolver options |
123
+ | program-view | diagnóstico e garantias reais |
124
+ | program-owner/lock/project-runtime | exclusividade/background seguro |
125
+ | cli/fabric, agent-memory/mcp, local-task-server | paridade pública e autoria sem dispatch |
126
+ | examples/agent-fabric-v2 | três workflows completos |
127
+ | tests/agent-fabric, scripts, CI | validação focada e redução de redundância |
128
+
129
+ ## Validação rápida e CI
130
+
131
+ Usar poucos testes agrupados de alto valor para invariantes novas: usage+invalid output+restart, fairness>=3, orçamento concorrente, recovery incompatível, proposta/gate e resolver. Reutilizar fixtures existentes; não adicionar testes que apenas espelham implementação. Não executar modelos reais. Typecheck/lint e geração/check necessários permanecem. Uma rodada focada após integração; repetir só por mudança/falha.
132
+
133
+ CI: reduzir matrix/smokes redundantes, seleção de PR fail-closed (common/unknown/missing history mantém cobertura ampla), preservar checks de contrato/segurança e checks exigidos. Não apagar testes existentes ou enfraquecer assertions para conseguir green. Branch principal preserva verificação abrangente; mudanças de packaging mantêm smoke relevante.
134
+
135
+ ## Gates e conclusão
136
+
137
+ G1 integridade; G2 continuidade; G3 operação explicável; G4 qualidade externa nos três workflows; G5 eficiência vs baseline; G6 competitividade controlada. G1-G3 validados deterministicamente. G4-G6 ficam condicionados a avaliações representativas posteriores, não ao sucesso de fixtures nem a implementação local. Documento de evidências deve distinguir implementado, verificado, opt-in e não medido.
@@ -0,0 +1,56 @@
1
+ # Forge Agent Fabric — revisão da implementação contra o plano
2
+
3
+ Data: 2026-10-10. Plano: `WORKFLOW_PROGRAM_COMPETITIVE_PLAN.md`.
4
+ Revisão e correções locais sobre a implementação em andamento, sem commit, push ou publicação.
5
+
6
+ ## Método e resultado
7
+
8
+ Três subagentes revisaram módulos diferentes daqueles que implementaram: runtime, workers e autoria/CI. A integração principal revisou a interface pública MCP e os limites das evidências. A revisão encontrou bugs e lacunas de implementação, corrigidos nesta entrega. Testes determinísticos foram direcionados aos caminhos afetados; nenhum modelo Codex/Claude real foi executado.
9
+
10
+ ## Correções por prioridade e módulo
11
+
12
+ | Prioridade / etapa | Problema encontrado | Mudança e critério de aceite |
13
+ |---|---|---|
14
+ | P0 / E3,E5 | Recuperação podia aceitar contexto/evidências diferentes; segunda recuperação podia perder a thread | `program-worker` vincula contexto entregue, observações adicionais e bytes das evidências ao fingerprint; `program-service` persiste threadId no novo dispatch. Retomada compatível passa e incompatibilidades bloqueiam antes do modelo. |
15
+ | P0 / E8 | Colisões arquivo/diretório e diferenças de caixa escapavam; resolver podia descartar arquivos fora de seu scope | `program-service` detecta colisões por trie e exige scope cobrindo todos os arquivos propostos. Resolver ainda produz candidato novo, com avaliação final nova. |
16
+ | P0 / E4 | Templates aceitavam contratos de aprovação/captura sem construir o fluxo necessário | `program-templates` exige approvalSchema compatível, cria waitEvent vinculado e gate autorizado; captura exige migration com population/evidence. Perfis não suportados são rejeitados antes do dispatch. |
17
+ | P0 / E1,E6 | Contadores inválidos ou semânticas misturadas podiam contaminar accounting | `program-observation` valida inteiros seguros, cached ≤ input e semântica por origem antes da persistência. Observações inválidas não alteram registro. |
18
+ | P1 / interface pública | MCP author-types sem argumentos exigia runId e falhava | `agent-memory/mcp` trata a ação separadamente. Chamada autenticada com `{}` chega ao owner; argumentos extras são rejeitados. |
19
+ | P1 / E4 | Autoria podia produzir scopes incompatíveis com executores/policy | Preflight intersecta permissões de acceptance/policy/executor e valida reviewers, checks, implementers e resolver, incluindo override explícito. |
20
+ | P1 / E2 | Capacidade em execução não podia diminuir pela API do host | `program-scheduler` e `program-service.updateRuntimeOptions` preservam attempts ativos e limitam novas admissões. Arquivo de configuração continua aplicado no startup/restart. |
21
+ | P1 / E6 | Usage desconhecido após apply não podia ser reconciliado | Reconciliação autenticada de usage aceita em applied, sem reabrir publicação, gate ou resume. |
22
+ | P1 / workers | UTF-8 dividido entre chunks podia ser corrompido | Workers command/Claude usam decodificação streaming; fixture de subprocesso local preserva caracteres multibyte. |
23
+ | P1 / CI | Bun retorna sucesso com filtro sem testes; guardas poderiam desaparecer silenciosamente | Política valida arquivos/nome dos testes; runner exige linha de resultado passing para cada gate crítico. Cobertura ampla continua nos módulos centrais. |
24
+ | P1 / lifecycle | Razão antiga de espera permanecia após aprovação e sucesso | Serviço limpa reason ao acordar e concluir validamente, preservando razões reais de falha e histórico. |
25
+ | P2 / E0 | Resumo individual não comparava equivalência entre relatórios | `compareBenchmarkReports` e CLI pareada verificam tasks/model/tools/context/contract/budget/criteria. Missing permanece null, contadores inválidos/overflow são rejeitados e entradas diferentes não autorizam superioridade controlada. |
26
+ | P2 / E7 | Perfil não separava cache/preparação/execução | `managed-environment` emite cache.verify/cache.copy/dependencies.install; worker observa workspace, environment, captura e execução, inclusive falhas. Duracões aninhadas não são soma de wall time. |
27
+
28
+ ## Dependências e compatibilidade
29
+
30
+ - ApprovalSchema e evidence executors pertencem ao registro do owner; workers não autorizam aprovação humana.
31
+ - Resume depende de término observado, reconciliação, workspace original e fingerprint compatível. Markers antigos sem a nova vinculação não são reescritos para parecer compatíveis.
32
+ - Redução de capacidade usa API confiável do host. Não há watcher automático nem parâmetro de workflow alterando a capacidade global.
33
+ - Review/bugfix convenience templates não suportam diretamente captura de população; migration suporta o perfil explícito. Fluxos UI mais amplos continuam disponíveis via IR existente, não devem ser apresentados como autoria automática universal.
34
+ - Métricas de preparação podem ocorrer antes da admissão; orçamento de tokens não mede custo de CPU/storage e não garante teto monetário.
35
+
36
+ ## Verificação focada
37
+
38
+ | Grupo | Evidência |
39
+ |---|---|
40
+ | Runtime | Quatro testes focados: counters inválidos/semântica, recuperação dupla, resize sem interrupção, reconciliação pós-apply e conflitos exact/hierarchy/case. Caso de conflito: 8,78 s após trie. |
41
+ | Workers | Dois testes direcionados, 23 assertions, aproximadamente 3 s; fingerprint adicional com 4 assertions. Git/contexto reais locais, sem provedor. |
42
+ | Interface pública | Dois testes, 17 assertions, 2,95 s; inclui owner HTTP local autenticado para MCP author-types. |
43
+ | Autoria/templates/benchmark/CI | Sete testes passaram em 4,99 s, incluindo aprovação humana consumida e gate novo. Seis testes unitários passaram em 316 ms após a guarda final de resultados de CI; sintaxe do runner válida. |
44
+ | Typecheck global e lint | Exit 0 em ambos. |
45
+ | Geração/export e framework | Geração, exports generic/codex e framework aprovados; 11 etapas, nenhuma falha, typecheck/testes omitidos somente nesta execução. Aviso existente FORGE_RLS_PGLITE_NOT_AUTHORITATIVE preservado. |
46
+
47
+ Os números correspondem a rodadas específicas e não devem ser somados como testes únicos. Verificação de framework omite suíte completa e repetição de typecheck, executados separadamente no escopo indicado. Não houve instalação de dependências, GitHub Actions ou inferência paga.
48
+
49
+ ## O que ainda falta
50
+
51
+ 1. **P0 de avaliação, G4–G6:** executar avaliação independente pareada de qualidade, eficiência e robustez em tarefas representativas. Depende de inputs controlados, critérios externos e medição completa. Sem essa evidência, não afirmar superioridade sobre Claude Code.
52
+ 2. **P1 operacional:** smoke com versão real compatível do Claude CLI e execução da nova CI no GitHub. Fixtures de protocolo não comprovam compatibilidade instalada ou duração real da CI.
53
+ 3. **P2 de conveniência:** ampliar templates review/bugfix para perfis UI/população, se necessário ao produto. Hoje a rejeição explícita impede gerar programas impossíveis; IR customizado oferece o fluxo completo.
54
+ 4. **Condicionais do plano:** cache entre runs, snapshots incrementais, GC e owner distribuído permanecem extensões, dependentes de medição ou necessidade concreta. Não são apresentados como implementados.
55
+
56
+ Os artefatos gerados são atualizados pelo gerador. Mudanças permanecem locais; arquivos preexistentes foram preservados. Esta revisão delimita a implementação e suas evidências, sem certificar produção ou qualidade de modelos.
@@ -0,0 +1,46 @@
1
+ # Owner-bound authoring templates
2
+
3
+ These JSON requests select the review, bugfix and migration templates. `program-author`
4
+ validates references against the owner's registry and returns a proposal without running
5
+ workers, replacing policies, applying changes or spending model tokens. Start is a
6
+ separate action. The supplied registry's workers and migration criteria are text-file
7
+ fixtures; replace them with real project contracts and verification commands for coding.
8
+
9
+ Review begins with assessment and requests an empty write scope. A negative assessment
10
+ cannot change files; bounded follow-up may end exhausted or stalled. Bugfix assesses
11
+ first, avoiding edits to an already accepted baseline. Migration consumes
12
+ `input.items: [{id, allowedPaths}]`, seals coverage against the owner population, repairs
13
+ each item only after a negative assessment, composes accepted candidates and assesses the integrated candidate before gate. An optional owner-authorized resolver can be selected in migration options; its candidate requires fresh final population evaluation.
14
+
15
+ Each repair preserves mandatory checks. Scoped acceptance must bind `component` to
16
+ `item` and `assessment` to `final`; templates do not mutate these owner bindings.
17
+ Human approval, when required, remains outstanding at the gate. Apply remains separate.
18
+ `program-author-types` exports owner schema/executor declarations for author assistance;
19
+ runtime validation is still authoritative.
20
+
21
+ ## Independent benchmark reports
22
+
23
+ `program-benchmark.ts` defines a versioned observation report. Record identity of runtime,
24
+ model, tools, context, contracts and budget for each task. Queue/preparation/execution/
25
+ capture/persistence/integration timings are optional observations; omitted means absent,
26
+ not zero. Consumption is observed, estimated or unknown. Independent evaluation requires
27
+ an assessor and criteria digest fixed independently of the implementer. Owner gate
28
+ approval alone does not qualify as external success.
29
+
30
+ Read and summarize an already collected report with:
31
+
32
+ ```sh
33
+ node --import tsx scripts/summarize-fabric-benchmark.mjs report.json
34
+ ```
35
+
36
+ This command only validates data. It does not run workflows, providers or benchmarks.
37
+ The existing deterministic benchmark scripts remain runtime references and do not prove
38
+ superiority over Claude or coding quality. Real evaluations are a separate explicit run.
39
+
40
+ ## CI scope
41
+
42
+ PRs changing only explicitly covered authoring, observation, benchmark or adapter modules use a small critical suite. Missing critical files fail closed.
43
+ Core owner/store/workspace/services, shared or unknown paths and main runs retain the full Agent Fabric suite. Workflow
44
+ contracts, typecheck, compiler checks, lint and the separate security gate remain.
45
+ Ubuntu/Node 22 CLI smoke runs once in verify; the matrix adds Windows 22 for PRs and
46
+ Ubuntu 24 on main. Manual CI includes macOS.
@@ -0,0 +1,12 @@
1
+ {
2
+ "kind": "bugfix",
3
+ "options": {
4
+ "id": "bugfix-workflow",
5
+ "inputSchema": { "id": "input", "version": "v1" },
6
+ "outputSchema": { "id": "gate", "version": "v1" },
7
+ "policy": { "id": "local", "version": "v1" },
8
+ "acceptance": { "id": "migration", "version": "v1" },
9
+ "implement": { "id": "migrate", "version": "v1" },
10
+ "review": { "id": "review", "version": "v1" }
11
+ }
12
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "kind": "migration",
3
+ "options": {
4
+ "id": "migration-workflow",
5
+ "inputSchema": { "id": "discovery", "version": "v1" },
6
+ "outputSchema": { "id": "gate", "version": "v1" },
7
+ "policy": { "id": "local", "version": "v1" },
8
+ "acceptance": { "id": "migration", "version": "v1" },
9
+ "implement": { "id": "migrate", "version": "v1" },
10
+ "review": { "id": "review", "version": "v1" },
11
+ "population": { "id": "files", "version": "v1" }
12
+ }
13
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "kind": "review",
3
+ "options": {
4
+ "id": "review-workflow",
5
+ "inputSchema": { "id": "input", "version": "v1" },
6
+ "outputSchema": { "id": "gate", "version": "v1" },
7
+ "policy": { "id": "local", "version": "v1" },
8
+ "acceptance": { "id": "migration", "version": "v1" },
9
+ "implement": { "id": "migrate", "version": "v1" },
10
+ "review": { "id": "review", "version": "v1" }
11
+ }
12
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "forgeos",
3
- "version": "0.1.0-alpha.71",
3
+ "version": "0.1.0-alpha.72",
4
4
  "description": "Agent-native application framework and compiler for building Forge apps without a mandatory dashboard.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -12,6 +12,7 @@
12
12
  "bin/",
13
13
  "scripts/field-test-forgeos.mjs",
14
14
  "scripts/install-agent-fabric-skill.mjs",
15
+ "scripts/summarize-fabric-benchmark.mjs",
15
16
  ".agents/skills/forge-agent-fabric/",
16
17
  "docs/cair-protocol.md",
17
18
  "docs/forge-protocol.md",
@@ -28,6 +29,9 @@
28
29
  "docs/architecture/agent-fabric/WORKFLOW_PROGRAM_V2_EVIDENCE.md",
29
30
  "docs/architecture/agent-fabric/WORKFLOW_PROGRAM_V2_CORRECTIONS.md",
30
31
  "docs/architecture/agent-fabric/WORKFLOW_PROGRAM_V2_CORRECTIONS_EVIDENCE.md",
32
+ "docs/architecture/agent-fabric/WORKFLOW_PROGRAM_COMPETITIVE_PLAN.md",
33
+ "docs/architecture/agent-fabric/WORKFLOW_PROGRAM_COMPETITIVE_EVIDENCE.md",
34
+ "docs/architecture/agent-fabric/WORKFLOW_PROGRAM_COMPETITIVE_REVIEW.md",
31
35
  "examples/go-billing/",
32
36
  "examples/agent-fabric-v2/",
33
37
  "examples/java-billing/",
@@ -0,0 +1,6 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { summarizeBenchmarkReport, compareBenchmarkReports } from "../src/forge/agent-fabric/program-benchmark.ts";
3
+ const path = process.argv[2];
4
+ if (!path) throw new Error("Usage: node --import tsx scripts/summarize-fabric-benchmark.mjs REPORT.json [COUNTERPART.json]");
5
+ const report = JSON.parse(await readFile(path, "utf8"));
6
+ console.log(JSON.stringify(process.argv[3] ? compareBenchmarkReports(report, JSON.parse(await readFile(process.argv[3], "utf8"))) : summarizeBenchmarkReport(report), null, 2));
@@ -1 +1 @@
1
- {"defaultProvider":"local","diagnostics":[],"env":{"deployEnv":"FORGE_DEPLOY_ENV","deployId":"FORGE_DEPLOY_ID","publicReleaseId":"NEXT_PUBLIC_FORGE_RELEASE_ID","releaseId":"FORGE_RELEASE_ID"},"gitSha":"unknown","optionalProviders":["local","sentry-compatible","sentry","glitchtip","bugsink","otel","custom"],"packageName":"forgeos","packageVersion":"0.1.0-alpha.71","releaseId":"forgeos@0.1.0-alpha.71+unknown","schemaVersion":"0.1.0"}
1
+ {"defaultProvider":"local","diagnostics":[],"env":{"deployEnv":"FORGE_DEPLOY_ENV","deployId":"FORGE_DEPLOY_ID","publicReleaseId":"NEXT_PUBLIC_FORGE_RELEASE_ID","releaseId":"FORGE_RELEASE_ID"},"gitSha":"unknown","optionalProviders":["local","sentry-compatible","sentry","glitchtip","bugsink","otel","custom"],"packageName":"forgeos","packageVersion":"0.1.0-alpha.72","releaseId":"forgeos@0.1.0-alpha.72+unknown","schemaVersion":"0.1.0"}
@@ -1,4 +1,4 @@
1
- // @forge-generated generator=0.1.0-alpha.71 input=c1757bb141bbcdd4d235a6d1af230b3a767ec7e4354f7fc3afb49fd46e893f06 content=cd16693ecfd3d8410340a10ca8d2fbd0c9a99361acd460af97c00a8c58a5032d
1
+ // @forge-generated generator=0.1.0-alpha.72 input=4096e19589f57b9568accde0ae34aa0782c1598f54261e161e1ff5ac7cc857b9 content=d749e9d32ae5d270f7ba002ac58ee67da6d8e1a0dd704ad5e9a05a4decf4d59f
2
2
  export const releaseManifest = {
3
3
  "defaultProvider": "local",
4
4
  "diagnostics": [],
@@ -19,7 +19,7 @@ export const releaseManifest = {
19
19
  "custom"
20
20
  ],
21
21
  "packageName": "forgeos",
22
- "packageVersion": "0.1.0-alpha.71",
23
- "releaseId": "forgeos@0.1.0-alpha.71+unknown",
22
+ "packageVersion": "0.1.0-alpha.72",
23
+ "releaseId": "forgeos@0.1.0-alpha.72+unknown",
24
24
  "schemaVersion": "0.1.0"
25
25
  } as const;
@@ -0,0 +1,95 @@
1
+ import { spawn, execFile } from "node:child_process";
2
+ import { promisify } from "node:util";
3
+ import type { ProgramWorkerObservation } from "./program-observation.ts";
4
+
5
+ /** The CLI is cooperative: neither network denial nor process-tree termination is attested. */
6
+ export const claudeProgramCapabilities = Object.freeze({ adapter: "claude", protocol: "stream-json", minimumVersion: "2.1.259", isolation: "cooperative", network: "host", structuredOutput: true, threadResume: true, nativeImages: false, hardTokenLimit: false, processTreeTermination: false });
7
+ export function validateClaudeProgramVersion(output: string): string {
8
+ const match = /^\s*(\d+)\.(\d+)\.(\d+)(?:\s|$)/.exec(output);
9
+ if (!match) throw new Error("Claude CLI version identity unavailable");
10
+ const [major, minor, patch] = match.slice(1).map(Number);
11
+ if (![major, minor, patch].every(Number.isSafeInteger) || major! < 2 || major === 2 && (minor! < 1 || minor === 1 && patch! < 259)) throw new Error("Claude CLI requires version >=2.1.259 for restricted unattended protocol");
12
+ return `${major}.${minor}.${patch}`;
13
+ }
14
+ export interface ClaudeProgramInput {
15
+ binary: string; cwd: string; prompt: string; schema: unknown; model?: string; threadId?: string;
16
+ writable: boolean; signal: AbortSignal; environment: NodeJS.ProcessEnv;
17
+ onThread: (id: string) => Promise<void>;
18
+ onEvent: (event: Omit<ProgramWorkerObservation, "id" | "at">) => Promise<void>;
19
+ }
20
+ export function claudeProgramArguments(input: Pick<ClaudeProgramInput, "schema" | "model" | "threadId" | "writable">): string[] {
21
+ const tools = input.writable ? "Read,Glob,Grep,Edit,Write" : "Read,Glob,Grep";
22
+ return ["--print", "--output-format", "stream-json", "--verbose", "--json-schema", JSON.stringify(input.schema),
23
+ "--restricted", "--strict-mcp-config", "--mcp-config", '{"mcpServers":{}}', "--disable-slash-commands",
24
+ "--settings", '{"disableAllHooks":true}', "--setting-sources", "", "--permission-mode", "dontAsk", "--permission-prompts", "none",
25
+ "--tools", tools, "--allowedTools", tools, ...(input.model ? ["--model", input.model] : []), ...(input.threadId ? ["--resume", input.threadId] : [])];
26
+ }
27
+ /** Parse only the documented operational envelope; never persist assistant/tool text. */
28
+ export function claudeProgramResult(event: Record<string, unknown>): { data: unknown; usage?: ProgramWorkerObservation["usage"] } {
29
+ if (event.type !== "result" || event.subtype !== "success" || event.is_error === true || !("structured_output" in event)) throw new Error("Claude structured completion not observed");
30
+ return { data: event.structured_output, usage: claudeProgramUsage(event) };
31
+ }
32
+ export function claudeProgramUsage(event: Record<string, unknown>): ProgramWorkerObservation["usage"] | undefined {
33
+ const raw = event.usage as Record<string, unknown> | undefined;
34
+ if (!raw) return undefined;
35
+ for (const key of ["input_tokens", "output_tokens"]) if (!Number.isSafeInteger(raw[key]) || (raw[key] as number) < 0) throw new Error("Invalid Claude usage counters");
36
+ for (const key of ["cache_read_input_tokens", "cache_creation_input_tokens"]) if (raw[key] !== undefined && (!Number.isSafeInteger(raw[key]) || (raw[key] as number) < 0)) throw new Error("Invalid Claude cache usage");
37
+ const cached = (raw.cache_read_input_tokens as number | undefined) ?? 0;
38
+ const inputTokens = (raw.input_tokens as number) + cached + ((raw.cache_creation_input_tokens as number | undefined) ?? 0);
39
+ if (!Number.isSafeInteger(inputTokens)) throw new Error("Claude aggregate usage exceeds safe counter bound");
40
+ return { input_tokens: inputTokens, cached_input_tokens: cached, output_tokens: raw.output_tokens as number };
41
+ }
42
+ export async function runClaudeProgramWorker(input: ClaudeProgramInput): Promise<{ data: unknown; usage?: ProgramWorkerObservation["usage"] }> {
43
+ if (process.env.FORGE_FABRIC_TEST_MODE === "1") throw new Error("Real Claude workers forbidden in deterministic test mode");
44
+ if (input.signal.aborted) throw new Error("Claude canceled before dispatch");
45
+ const identity = await promisify(execFile)(input.binary, ["--version"], { cwd: input.cwd, env: input.environment, windowsHide: true, timeout: 10000, maxBuffer: 4096, signal: input.signal }).catch(() => { throw new Error("Claude CLI version inspection failed; model dispatch refused"); });
46
+ const version = validateClaudeProgramVersion(identity.stdout);
47
+ await input.onEvent({ type: "adapter.version", source: "claude", metadata: { version, minimumVersion: claudeProgramCapabilities.minimumVersion } });
48
+ if (input.signal.aborted) throw new Error("Claude canceled before model dispatch");
49
+ return new Promise((resolve, reject) => {
50
+ const child = spawn(input.binary, claudeProgramArguments(input), { cwd: input.cwd, env: input.environment, shell: false, windowsHide: true });
51
+ let pending = "", bytes = 0, count = 0, resultObserved = false, sessionId = input.threadId, final: ReturnType<typeof claudeProgramResult> | undefined;
52
+ let queue = Promise.resolve(), failure: unknown, settled = false, grace: ReturnType<typeof setTimeout> | undefined;
53
+ const finish = (error?: unknown) => { if (settled) return; settled = true; if (grace) clearTimeout(grace); input.signal.removeEventListener("abort", abort); if (error) reject(error); else resolve(final!); };
54
+ const abort = () => { child.kill(); grace ??= setTimeout(() => { child.stdout.destroy(); child.stderr.destroy(); child.unref(); finish(new Error("Claude termination/effects unknown; reconcile before retry")); }, 1000); };
55
+ input.signal.addEventListener("abort", abort, { once: true });
56
+ const consume = (line: string) => {
57
+ queue = queue.then(async () => {
58
+ if (settled || failure) return;
59
+ if (++count > 10000) throw new Error("Claude event budget exceeded");
60
+ const event = JSON.parse(line) as Record<string, unknown>;
61
+ if (typeof event.session_id === "string") {
62
+ if (!/^[A-Za-z0-9][A-Za-z0-9_.:-]{0,127}$/.test(event.session_id) || sessionId && event.session_id !== sessionId) throw new Error("Claude session identity mismatch");
63
+ if (!sessionId) { sessionId = event.session_id; await input.onThread(sessionId); }
64
+ }
65
+ if (event.type === "result") {
66
+ if (settled) return;
67
+ if (resultObserved) throw new Error("Duplicate Claude result");
68
+ resultObserved = true;
69
+ const usage = claudeProgramUsage(event);
70
+ if (usage) await input.onEvent({ type: "usage", source: "claude", usage, semantics: "incremental" });
71
+ final = claudeProgramResult(event);
72
+ }
73
+ }).catch(error => { failure = error; abort(); });
74
+ };
75
+ child.stdout.setEncoding("utf8");
76
+ child.stdout.on("data", (chunk: string) => {
77
+ bytes += Buffer.byteLength(chunk);
78
+ if (bytes > 4 * 1024 * 1024) { failure = new Error("Claude output budget exceeded"); abort(); return; }
79
+ pending += chunk; let index: number;
80
+ while ((index = pending.indexOf("\n")) >= 0) { const line = pending.slice(0, index).trim(); pending = pending.slice(index + 1); if (line) consume(line); }
81
+ });
82
+ child.stderr.on("data", () => {});
83
+ child.once("error", () => finish(new Error("Claude executable unavailable or launch failed")));
84
+ child.once("close", async code => {
85
+ if (pending.trim()) consume(pending.trim()); await queue;
86
+ try {
87
+ await input.onEvent({ type: "process.closed", source: "claude", metadata: { exitCode: code, rootTerminationObserved: true, processTreeTermination: false } });
88
+ finish(failure || input.signal.aborted || code !== 0 || !final ? new Error("Claude completion/effects require reconciliation") : undefined);
89
+ } catch (error) { finish(error); }
90
+ });
91
+ child.stdin.on("error", () => { failure = new Error("Claude input delivery failed"); abort(); });
92
+ child.stdin.end(input.prompt);
93
+ if (input.signal.aborted) abort();
94
+ });
95
+ }