Develop - #212
Merged
Merged
Conversation
…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>
…sem caminho de baixo risco
…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.
…epairorchestrator feat(ai): gera XSLT real via RepairOrchestrator/Ollama, substitui XML-direto como motor primario
Dependency Review✅ No vulnerabilities or license issues or OpenSSF Scorecard issues found.Scanned FilesNone |
| { | ||
| _logger.LogDebug(parseEx, | ||
| "Pathway IA: parse posicional para ParsedFieldRootTreeBuilder falhou — motor novo degrada para o loop legado (layout={LayoutName})", | ||
| layoutName); |
| { | ||
| // EnqueueAsync não deveria lançar (contrato do serviço), mas isolamento total aqui | ||
| // também — nunca derrubar o job em background por causa da IA. | ||
| _logger.LogWarning(ex, "Falha ao disparar o pathway IA para layout {LayoutName}", layoutName); |
| } | ||
| catch (Exception ex) | ||
| { | ||
| _logger.LogDebug(ex, "IXslSynthesizerService indisponível/falhou — degradando para o loop XML-direto legado (mapperGuid={MapperGuid})", mapperGuid); |
| { | ||
| _logger.LogWarning( | ||
| "ParsedFieldRootTreeBuilder recusou montar o ROOT (gate de qualidade) — {Motivo} (mapperGuid={MapperGuid})", | ||
| built.Motivo, mapperGuid); |
|
|
||
| _logger.LogInformation( | ||
| "ROOT construído via ParsedFieldRootTreeBuilder: {LinhasDistintas} tipo(s) de linha, {ComValor}/{Total} campo(s) com valor (mapperGuid={MapperGuid})", | ||
| built.LinhasDistintas, built.CamposComValor, built.CamposFisicos, mapperGuid); |
| { | ||
| // Resiliência (dotnet-standards.md): Ollama/RepairOrchestrator podem falhar — | ||
| // nunca propaga exceção não tratada pro chamador (fire-and-forget). | ||
| _logger.LogError(ex, "Falha não tratada na síntese de XSLT via RepairOrchestrator (mapperGuid={MapperGuid})", mapperGuid); |
| } | ||
| catch (Exception ex) | ||
| { | ||
| _logger.LogWarning(ex, "MapeadorVO do mapper {MapperGuid} não é XML bem-formado", mapperGuid); |
| { | ||
| if (string.IsNullOrWhiteSpace(mapperName)) | ||
| { | ||
| _logger.LogWarning("Não foi possível persistir o XSLT sintetizado — mapper sem Name (layout={LayoutName})", layoutName); |
| Directory.CreateDirectory(_xslBasePath); | ||
| var path = Path.Combine(_xslBasePath, $"{mapperName}_{layoutName}.xsl"); | ||
| File.WriteAllText(path, xslt); | ||
| _logger.LogInformation("XSLT sintetizado via RepairOrchestrator persistido em {Path}", path); |
| } | ||
| catch (Exception ex) | ||
| { | ||
| _logger.LogWarning(ex, "Falha ao persistir o XSLT sintetizado (layout={LayoutName})", layoutName); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.