Skip to content

Develop - #212

Merged
elson-vinicius-lopes merged 5 commits into
masterfrom
develop
Aug 29, 2026
Merged

Develop#212
elson-vinicius-lopes merged 5 commits into
masterfrom
develop

Conversation

@elson-vinicius-lopes

Copy link
Copy Markdown
Collaborator

No description provided.

elson-vinicius-lopes and others added 5 commits August 29, 2026 10:21
…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.
…epairorchestrator

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

Copy link
Copy Markdown

Dependency Review

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

Scanned Files

None

{
_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);
@elson-vinicius-lopes
elson-vinicius-lopes merged commit 4a11b9a into master Aug 29, 2026
7 checks passed
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.

2 participants