Skip to content

feat(ai): gera XSLT real via RepairOrchestrator/Ollama, substitui XML-direto como motor primario - #211

Merged
elson-vinicius-lopes merged 11 commits into
developfrom
feat/xslt-real-via-ollama-repairorchestrator
Aug 29, 2026
Merged

feat(ai): gera XSLT real via RepairOrchestrator/Ollama, substitui XML-direto como motor primario#211
elson-vinicius-lopes merged 11 commits into
developfrom
feat/xslt-real-via-ollama-repairorchestrator

Conversation

@elson-vinicius-lopes

Copy link
Copy Markdown
Collaborator

Resumo

Integra o RepairOrchestrator (loop de geracao/reparo de XSLT via Ollama) ao runtime como
motor primario de transformacao, substituindo o caminho legado de XML-direto. Fallback
gracioso preservado quando o novo caminho nao for aplicavel.

Commits da cadeia

  • 0c4ccb9 feat(ai): integra RepairOrchestrator ao runtime - gera XSLT real via Ollama em vez de XML direto
  • f640cb6 docs(architecture): documenta gap de input XML do RepairOrchestrator sem caminho de baixo risco
  • 346fa85 feat(ai): constroi XML de entrada do RepairOrchestrator a partir do parse posicional real (novo conversor ParsedFieldRootTreeBuilder, TXT parseado -> XML ROOT)
  • 6239639 fix(ai): move ParseAsync do ParsedFieldRootTreeBuilder para dentro do job fire-and-forget, corrige regressao de latencia sincrona (preserva fire-and-forget via IServiceScopeFactory)

Docs de arquitetura relacionados

  • docs/architecture/gap-real-ollama-geracao-tcl-xsl-2026-08-21.md
  • docs/architecture/design-integracao-repairorchestrator-runtime-2026-08-21.md
  • docs/architecture/decisao-pendente-input-xml-repairorchestrator-2026-08-29.md

Validacao

  • dotnet build verde
  • dotnet test: 479/479 (59 XslSynth.Core.Tests + 420 LayoutParserApi.Tests)
  • QA (Quinn): PASS

🤖 Generated with Claude Code

elson-vinicius-lopes and others added 11 commits August 26, 2026 10:20
…Ollama em vez de XML direto

- Novo IXslSynthesizerService/RepairOrchestratorXslSynthesizerService encapsula o
  RepairOrchestrator real de ai/XslSynth.Core (referencia in-process, sem boundary
  Linux/WSL - Opcao B do design doc de 2026-08-21).
- AiTransformationCandidateService.RunLoopAsync tenta o motor novo primeiro; se nao
  se aplicar (entrada nao-XML, mapper nao resolvido, excecao), degrada para o loop
  legado XML-direto via Ollama - nunca quebra o job (contrato externo intacto).
- XSLT convergido e persistido em TransformationPipeline:XslPath, convencao
  {mapperName}_{layoutName}.xsl (mesma que o pathway tcl-xsl ja le).
- TransformationCandidate ganha campo GeneratedXslt (aditivo).
- Testes novos cobrindo sucesso do synthesizer e degradacao para o legado; suite
  completa (109 + 13) verde.

Limitacoes documentadas no codigo: resolucao de MapperGuid->Mapper via filtro sobre
GetAllMappersAsync (sem metodo direto no ICachedMapperService); resolucao do
caminho do XSD duplica a convencao privada de XsdValidationService.FindXsdFile.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…arse posicional real

Fecha o gap documentado em docs/architecture/decisao-pendente-input-xml-
repairorchestrator-2026-08-29.md (Opcao 1 confirmada pela Aria): o
RepairOrchestratorXslSynthesizerService tentava XDocument.Parse(TXT cru) e
sempre falhava, tornando o motor novo codigo morto em producao.

- ParsedFieldRootTreeBuilder (Services/Transformation/Ai/): converte
  ParsedField (parser posicional REAL da API) -> XDocument ROOT, no mesmo
  dialeto plano que RootTreeBuilder/TclRootBuilder ja produzem em
  ai/XslSynth. Fica no lado da API (nao em ai/XslSynth.Core) para nao
  acoplar a classlib compartilhada ao dominio da API - o CLI standalone
  continua isolado. Tem gate de qualidade (taxa minima de campos com
  valor) para nao produzir ROOT vazio/lixo que convirja trivialmente.
- IXslSynthesizerService/RepairOrchestratorXslSynthesizerService: novo
  parametro opcional parsedFields, com precedencia sobre o parse de
  inputXml como XML pronto.
- AiTransformationCandidateService/IAiTransformationCandidateService:
  parsedFields propagado por EnqueueAsync -> RunLoopAsync ->
  TrySynthesizeXsltAsync -> SynthesizeAsync.
- TransformationExecutionController.TryEnqueueAiCandidate: resolve os
  ParsedFields via parse proprio (ILayoutParserService) antes de disparar
  o job IA; falha de parse degrada para parsedFields=null (loop legado).
- Teste novo usa o LayoutParserService REAL (nao mock) para provar que o
  ParsedField chega intacto ao synthesizer e que o
  ParsedFieldRootTreeBuilder monta o XDocument de verdade.

Build e testes completos verdes (420 + 59 = 479, sem regressao).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
… job fire-and-forget, corrige regressao de latencia sincrona

TryEnqueueAiCandidate voltou a nao bloquear a resposta sincrona de
execute-candidates: o ParseAsync que monta os ParsedField pro
RepairOrchestrator (Issue #140) e o EnqueueAsync agora rodam dentro de
um Task.Run disparado sem await, nao mais antes dele. ILayoutParserService
e Scoped, entao o job resolve sua propria instancia via
IServiceScopeFactory (nao captura o do controller, que morre com o
scope da request).

Ajustes de teste: TransformationExecutionControllerUserIsolationTests
passa a fazer polling apos invocar TryEnqueueAiCandidate via reflection
(era sincrono, virou fire-and-forget); FieldMappingsTests e
PathwayDiagnosticsTests ganham o novo parametro scopeFactory no
construtor do controller.
@github-actions

Copy link
Copy Markdown

Dependency Review

✅ No vulnerabilities or license issues or OpenSSF Scorecard issues found.

Scanned Files

None

@elson-vinicius-lopes
elson-vinicius-lopes merged commit 23b2de0 into develop Aug 29, 2026
4 checks passed
@elson-vinicius-lopes
elson-vinicius-lopes deleted the feat/xslt-real-via-ollama-repairorchestrator branch August 29, 2026 14:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant