Skip to content

Develop - #396

Merged
elson-vinicius-lopes merged 11 commits into
masterfrom
develop
Sep 11, 2026
Merged

elson-vinicius-lopes merged 11 commits into
masterfrom
develop

Conversation

@elson-vinicius-lopes

Copy link
Copy Markdown
Collaborator

No description provided.

elson-vinicius-lopes and others added 11 commits September 10, 2026 14:06
…ino (issue #346) (#369)

- IFieldCorrectionStore: ListPendingReportsAsync, GetReportAsync, TransitionStatusAsync
  (transicao so a partir de 'pending', idempotente via WHERE Status='pending')
- SqlFieldCorrectionStore: implementacao ADO.NET + projecao FieldCorrectionReportSummary
- Endpoints em TransformationExecutionController ([Authorize(Roles="admin")], sem papel
  "fiscal" no projeto ainda - TODO #346):
    GET  /api/transformation/field-correction/pending
    POST /api/transformation/field-correction/{reportId}/review  { decision: accepted|rejected }
- So 'reviewed_accepted' gera linha JSONL incremental com source="human-correction-reviewed";
  rejected/pending nunca entram. GroundTruthXml do contexto nunca e sobrescrito.
- TrainingDataCaptureService: writer comum AppendJsonlLine + TryCaptureHumanCorrection
  (reusa path/rotacao/contador, sem duplicar File.AppendAllText)
- 14 testes novos (transicao idempotente, so accepted gera JSONL, rejected/pending nao,
  ground truth intacto, autorizacao fail-closed)

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
…URI (#371)

Token de acesso v2 do Entra (App Registration com accessTokenAcceptedVersion=2,
aplicado no manifest em 2026-09-10 para resolver o mismatch de issuer v1/v2)
traz aud = GUID do recurso, nao o Application ID URI. A validacao esperava
"api://f76c2598-..." e falhava com IDX10214 (audience validation failed) no
reteste M2M do Cypress (issue LayoutParserCypress#13).

Troca Authentication:ServiceClient:Audience de "api://f76c2598-4759-48a9-8145-8a967ec7ac96"
para "f76c2598-4759-48a9-8145-8a967ec7ac96". O identifierUris do App Registration
continua api://<guid> (e o que o consumidor pede como scope /.default) - so o aud
emitido no token v2 e o GUID puro. Comentario em appsettings.json e XML doc de
ServiceClientAuthenticationOptions.Audience atualizados.

Sem mudanca de codigo/logica - so config + doc. 24 testes de seguranca M2M/SmartAuth
seguem verdes.

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
…ra o estado da API (#375)

Mapeia por pergunta o delta JÁ EXISTE / PARCIAL / NÃO EXISTE para o editor de
artefato TCL/XSL/XSLT + RBAC (#226) e catálogo/ciclo de vida de mappings
fiscais (#198), com ponteiros de arquivo/linha e recomendação de quebra em
sub-issues.

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
… o front (#376) (#384)

Publica os 3 itens que o cross-check #226/#198 concluiu que "fecham só
documentando", sem código de produção novo:

- Matriz RBAC endpoint x papel dos controllers de mapping (governanca,
  drafts, compilacao), levantada do codigo com ponteiro arquivo/linha.
- Vocabulario de erro otimista do PATCH .../rules/{ruleId}
  (200+eTag / 412 {current} / 428 / 400 / 422 / 404; sem 401, sem 403).
- Shape do diff estruturado ja existente (NodeDiff -> MappingTestRunDivergence)
  exposto em testRunSummary.divergences, com JSON de exemplo.

Doc dedicado em docs/architecture/ linkado de nova subsecao README 8.1
(bilingue). XML docs de RBAC nos endpoints approve/publish/rollback/List e
remarks de status no handler PATCH de regra.

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
…eleases (issue #377) (#385)

Adiciona query params opcionais e combináveis ao endpoint de listagem de
releases: status (validado contra MappingReleaseStatus.All -> 400 se inválido),
draftId (GUID -> 400 se não-parseável) e environment. Propagados até
IMappingReleaseStore.ListByWorkspaceAsync, que monta um WHERE condicional
parametrizado (fragmentos constantes, valores só via SqlParameter). Sem filtro,
o comportamento e o shape da resposta são idênticos ao anterior.

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
…uid (#386)

generate-for-layout gerava o .tcl mas nenhum .xsl para o layout FIAT
LAY_TXT_MQSERIES_ENVNFE_4.00_NFe (Cypress #14), com warning "Nenhum
mapeador encontrado". Causa: GetMappersByLayoutGuidAsync /
GetMapperByInputLayoutGuidAsync / GetMapperByTargetLayoutGuidAsync
faziam igualdade exata do GUID contra [tbMapper], mas as colunas
InputLayoutGuid/TargetLayoutGuid sao gravadas com prefixo "LAY_"
enquanto o chamador (AutoTransformationGeneratorService) passa o GUID
cru (layout.LayoutGuid.ToString()) -> 0 linhas -> XSL nao gerado.

Aplica a mesma normalizacao (NormalizeLayoutGuid) ja usada em
GetMappersByLayoutGuidForPackagesAsync: SQL busca as duas formas
(com e sem LAY_) e as comparacoes em memoria comparam sem prefixo.
Consulta continua read-only no banco compartilhado.

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
…ingRelease (issue #378) (#389)

Adiciona POST .../mapping-releases/{releaseId}/deprecate e /archive no
MappingGovernanceController, alinhados ao padrao de approve/publish/rollback.

- deprecate: published -> deprecated; idempotente (no-op se ja deprecated);
  origem != published -> 422 PT-BR.
- archive: deprecated|test_failed|in_review -> archived; idempotente;
  origem invalida (ex.: published) -> 422 PT-BR.
- RBAC: [RequireWorkspaceRole(FiscalAdmin, Owner)] como publish/rollback.
- Novos metodos DeprecateAsync/ArchiveAsync no IMappingReleaseStore /
  SqlMappingReleaseStore: validacao de estado + UPDATE + trilha em
  MappingTransition, tudo no IdentityDatabase.
- 8 testes novos (transicao valida, 422, idempotencia, isolamento cross-workspace);
  fakes de IMappingReleaseStore atualizados nos demais testes.

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
…sue #391) (#392)

O `tools/LowCodeRunner/Functions/log4net.dll` versionado tinha AssemblyVersion
real 1.2.13.0 (FileVersion 1.2.13.0 — pacote log4net <= 2.0.8, ~2017), mas o
`LayoutParserLowCodeRunner.exe.config` (e o App.config que o gera) já declaram
`bindingRedirect ... newVersion="2.0.17.0"`. Resultado: o CLR tentava carregar
log4net 2.0.17.0 e achava 1.2.13.0 na pasta -> FileLoadException em
`SysMiddle.Base.InstanceFactory.Initialize()`, quebrando o `execute-lowcode`
com o runner real.

Evidência (ildasm /assembly extern):
- SysMiddle.Base.dll        -> referencia log4net .ver 2:0:16:0
- SysMiddle.Map4Connect.Logger.dll -> referencia log4net .ver 1:2:13:0
- .exe.config / App.config  -> redirect 0.0.0.0-2.0.17.0 => 2.0.17.0

Opção escolhida: (b) repor a DLL, não mexer no redirect. Repor 2.0.17.0 satisfaz
as DUAS referências Sysmiddle via o redirect já existente (nenhuma mudança de
config), mantém um log4net atual (correções de segurança da linha 2.0.x) e evita
rebaixar um assembly compilado em 2023 (SysMiddle.Base) para um log4net de 2017.
A opção (a) — redirect para 1.2.13.0 — forçaria SysMiddle.Base 2.0.16 sobre um
binário antigo que pode não ter as APIs usadas. DLL obtida de
`nuget.org/api/v2/package/log4net/2.0.17`, `lib/net45/log4net.dll`
(AssemblyVersion 2.0.17.0, PublicKeyToken 669e0ddf0bb1aa2a — SNK oficial do
Apache, a mesma do redirect). `log4net.xml` atualizado junto para casar com o
binário.

Sem rebuild do runner (net481 + x86 + DLLs Sysmiddle licenciadas fora do git):
correção é só no conteúdo versionado de `Functions/`.

Nota: os `.dll.config` irmãos (`appConnector.Client.{Core,Interface,ProcessInterface}.dll.config`)
redirecionam log4net para 1.2.11.0, mas são config por-assembly de plugin —
o CLR só honra o binding do processo (.exe.config) no AppDomain default, então
são inertes e já divergentes de tudo; deixados como estão para não gerar churn.

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
…issue #373)

O step de deploy publicava o LayoutParserLowCodeRunner.exe dentro de uma Bin
do AppConnector de terceiros, "mais completa", varrida no host. No .42 nao ha
Bin apta -> execute-lowcode falha com 500 "runner .exe nao encontrado". O
LowCode:RunnerPath (<deploy>/api/LayoutParserLowCodeRunner.exe) nunca batia
com onde o step copiava.

Com o #391/#392 a pasta versionada tools/LowCodeRunner/Functions/ passou a ter
log4net 2.0.17.0 ao lado de SysMiddle.Base.dll: virou um runtime home completo.
Agora o deploy.yml (e o ci-dev.yml, por paridade):

- copia Functions/ inteira para <deploy>/api/lowcode-runner/ do checkout do job;
- resolve LOWCODE_RUNNER_PATH_RESOLVED para o .exe nesse local (consumido pelo
  step de Environment do servico, como antes);
- remove a busca por Bin de terceiros; fallback so se Functions/ regredir;
- adiciona lowcode-runner/ a allowlist do clean-deploy;
- appsettings.json: RunnerPath default aponta para o novo subdir.

Smoke test: novo step nao-fatal roda o runner em modo LIST (sobe o SDK sem
transformacao real) e avisa alto se o runner nao iniciar. Nao-fatal por ora
para nao acoplar todo deploy da API a um runtime de terceiros ainda nao provado
no .42; recomendacao de promover a fatal registrada no cabecalho do step.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…dicao manual de artefato (#381) (#394)

- adr-perfil-fiscal-draft-release: FiscalProfile como VO, snapshot imutavel na
  MappingRelease + copia de trabalho mutavel no MappingDraft; enums fechados para
  documentType/operation, jurisdiction semiaberto (UF+BR), schemaVersion validada
  por cruzamento com XsdValidation:DocumentTypes; coluna JSON via DDL lazy no
  IdentityDatabase; endpoint PUT .../fiscal-profile. Desbloqueia #380/#198.5.
- adr-edicao-manual-artefato-versionamento: edicao manual = nova MappingRelease
  derivada (DerivedFromReleaseId + ArtifactSource=manual_edit), identidade passa a
  (DraftId, RulesSnapshotHash, ArtifactContentHash); reusa If-Match/412/428 do
  PATCH de regra; RBAC Mapper/FiscalAdmin/Owner; coexiste com recompilacao sem
  sobrescrita; re-aprovacao obrigatoria pela governanca existente.

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
…owcode-373

fix(deploy): publica runner low-code em <deploy>/api/lowcode-runner (issue #373)
@github-actions

Copy link
Copy Markdown

Dependency Review

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

Scanned Files

None

{
_logger.LogWarning(
"Contexto do documento ausente/expirado ao montar o exemplo de treino do reporte aceito (reportId={ReportId} documentId={DocumentId})",
reportId, report.DocumentId);
@elson-vinicius-lopes
elson-vinicius-lopes merged commit f9e4ce3 into master Sep 11, 2026
8 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