Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
157a32c
fix(figuras): curva DET era reta horizontal — np.interp com eixo inve…
ErleySC Aug 7, 2026
f1ff4b3
fix(figuras): biplot PCA com rotulos sobrepostos e loadings redundantes
ErleySC Aug 7, 2026
9df119d
fix(cli): painel de execucao apagava a tela em corridas com muitas fi…
ErleySC Aug 7, 2026
7f4fe63
feat(diagnostico): detecta regiao espectral morta/ruidosa na faixa co…
ErleySC Aug 7, 2026
f975262
fix(io): np.interp sem ordenar eixo espectral em 3 sitios (predicao/d…
ErleySC Aug 7, 2026
11d63fa
docs: registra P10 (figuras erradas descobertas na 1a execucao real) …
ErleySC Aug 7, 2026
daefcdf
fix(cli): painel tela preta persistia — causa real era stdout global,…
ErleySC Aug 7, 2026
4a264d5
fix(figuras): DD-SIMCA acceptance plot com piso fixo escondia 91% dos…
ErleySC Aug 7, 2026
a41bb0f
fix(figuras): auditoria completa — piso fixo em mais 2 figuras cortav…
ErleySC Aug 7, 2026
e887e34
fix(figuras): fig_cooman_ddsimca usa densidade adaptativa, nao s=20 fixo
ErleySC Aug 7, 2026
b51f361
fix(sci): DD-SIMCA usa distancia combinada, nao regra retangular (fec…
ErleySC Aug 7, 2026
3784c45
feat(sci): diagnostico DD-SIMCA complementar via Procrustes Cross-Val…
ErleySC Aug 7, 2026
b1a5ee2
feat(sci): diagnostico robusto (mediana/MAD) de replicas de treino at…
ErleySC Aug 7, 2026
6c722b8
docs: reverifica ESTADO ALEGADO e roadmap — N2 real desatualizado
ErleySC Aug 7, 2026
19ddbf5
docs(auditoria): auditoria metodologica do nucleo cientifico (5 achados)
ErleySC Aug 7, 2026
829069b
fix(sci): teste de permutacao/Wold permuta rotulos por GRUPO (fecha A1)
ErleySC Aug 7, 2026
9e1e89a
fix(sci): Selectivity Ratio usa b/||b|| (vetor de regressao), nao w1 …
ErleySC Aug 7, 2026
cd8a7ef
fix(sci): dominio de aplicabilidade usa distancia combinada, nao regr…
ErleySC Aug 7, 2026
3d88b46
docs(sci): corrige docstring de hotelling_t2_limite; retrata achado A…
ErleySC Aug 7, 2026
ff95b7b
fix(sci): OPLS-DA multiclasse usa PLS2, nao LDA, para o alvo continuo…
ErleySC Aug 7, 2026
e7db430
chore(auditoria): lint dos scripts de medicao (ruff check . limpo no …
ErleySC Aug 7, 2026
99fc04c
docs(claude-md): registra P11 (auditoria metodologica, 5 achados) e r…
ErleySC Aug 7, 2026
158d295
fix(cli): barra de progresso trava em 85,7% durante a etapa mais demo…
ErleySC Aug 7, 2026
8591d2a
fix(cli): main() gira para sempre com EOF no stdin em vez de sair
ErleySC Aug 7, 2026
cf452eb
ci: reduz matriz de teste em PRs (cota de minutos do Actions esgotada)
ErleySC Aug 7, 2026
f0b5912
refactor(log): migra print() -> logging nos 2 modulos do nucleo cient…
ErleySC Aug 7, 2026
1cc98c8
perf(preproc): MSC.transform vetorizado (forma fechada, sem loop de l…
ErleySC Aug 7, 2026
3d63545
test(spectra_preview): cobertura 0% -> 94% (achado da auditoria 2026-…
ErleySC Aug 7, 2026
975960b
fix(cli): estado do usuario (config.yaml, perfis, flags) sai do diret…
ErleySC Aug 7, 2026
fbab311
fix(seg): fecha bypass da mitigacao de RCE via pickle no app web (CRI…
ErleySC Aug 7, 2026
f0634f0
fix(seg): os.system com f-string vira subprocess com lista de args (B…
ErleySC Aug 7, 2026
ba2c4e9
docs: registra esta sessao no CHANGELOG; atualiza SECURITY.md pos-cor…
ErleySC Aug 7, 2026
2e1207b
docs(claude-md): reverifica ESTADO ALEGADO no fim da sessao (663->701…
ErleySC Aug 7, 2026
b49beea
chore: revisao final de release — corrige P7 desatualizado, registra …
ErleySC Aug 16, 2026
7b0faf2
chore: remove toda referencia institucional dos arquivos versionados
ErleySC Aug 16, 2026
3cb09f5
docs(seg): adia divulgacao do passo a passo do S1 ate' a correcao est…
ErleySC Aug 16, 2026
cd95822
fix(ci): adiciona prcv ao requirements.txt -- gate de cobertura do nu…
ErleySC Aug 16, 2026
0f10ad8
docs(seg): S4 resolvido -- espectros reais removidos do clone local
ErleySC Aug 16, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 14 additions & 10 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -57,21 +57,25 @@ jobs:
# Matriz cruzada: o produto é Windows-first (código de encoding/console
# específico de win32 em guaraci.py/cli_assistente.py), então validamos em
# windows-latest além de ubuntu e macos, nas pontas da faixa suportada
# (3.10–3.13, requires-python em pyproject.toml). macOS só entra nas
# pontas (3.10/3.13) para não triplicar o tempo total de CI à toa — Windows
# e Linux já cobrem toda a faixa de versão.
# (3.10–3.13, requires-python em pyproject.toml).
#
# REDUZIDA em PR (2026-08-07, cota de minutos do Actions esgotada numa
# conta privada): o multiplicador de minutos do GitHub é 1x Linux / 2x
# Windows / 10x macOS — a matriz cheia (10 combinações, incl. 2 macOS)
# custava caro demais para rodar em CADA push de uma PR em iteração. Em
# `pull_request`, roda só 3 combinações (Ubuntu 3.10/3.13 nas pontas da
# faixa suportada + 1 Windows, sem macOS — ainda pega regressão de
# encoding/console win32, só não a cada iteração). A matriz CHEIA (10
# combinações, macOS incluso) só roda em `push` para master/main — ou
# seja, uma vez por merge, não uma vez por commit de PR. Se a cota
# voltar a sobrar, reverter é so' trocar `matrix.include` de volta pela
# combinação de `os`+`python-version` (ver historico do arquivo).
test:
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, windows-latest]
python-version: ["3.10", "3.11", "3.12", "3.13"]
include:
- os: macos-latest
python-version: "3.10"
- os: macos-latest
python-version: "3.13"
include: ${{ github.event_name == 'pull_request' && fromJSON('[{"os":"ubuntu-latest","python-version":"3.10"},{"os":"ubuntu-latest","python-version":"3.13"},{"os":"windows-latest","python-version":"3.11"}]') || fromJSON('[{"os":"ubuntu-latest","python-version":"3.10"},{"os":"ubuntu-latest","python-version":"3.11"},{"os":"ubuntu-latest","python-version":"3.12"},{"os":"ubuntu-latest","python-version":"3.13"},{"os":"windows-latest","python-version":"3.10"},{"os":"windows-latest","python-version":"3.11"},{"os":"windows-latest","python-version":"3.12"},{"os":"windows-latest","python-version":"3.13"},{"os":"macos-latest","python-version":"3.10"},{"os":"macos-latest","python-version":"3.13"}]') }}

defaults:
run:
Expand Down
6 changes: 2 additions & 4 deletions CITATION.cff
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,11 @@ abstract: >
(HPLC, GC-MS) and resonance (NMR, IMS) data. It implements PLS-DA, OPLS-DA,
DD-SIMCA, VIP, SHAP and Monte Carlo CV with anti-leakage group-aware
validation, and offers a Rich-based bilingual terminal interface (GUARACI)
plus a Streamlit web app. Originally developed at GEAAp/UFPA for FT-NIR
authentication of Amazonian vegetable oils.
plus a Streamlit web app. Originally developed for FT-NIR authentication of
Amazonian vegetable oils.
authors:
- family-names: "Costa"
given-names: "Erley S. da"
affiliation: "GEAAp/UFPA — Grupo de Espectroscopia Analítica Aplicada"
email: "erleysdacosta@gmail.com"
website: "http://lattes.cnpq.br/5755582193284309"
orcid: "https://orcid.org/0009-0005-9655-6349"
Expand Down Expand Up @@ -80,7 +79,6 @@ preferred-citation:
authors:
- family-names: "Costa"
given-names: "Erley S. da"
affiliation: "GEAAp/UFPA"
website: "http://lattes.cnpq.br/5755582193284309"
orcid: "https://orcid.org/0009-0005-9655-6349"
version: "31.9.0"
Expand Down
179 changes: 156 additions & 23 deletions CLAUDE.md

Large diffs are not rendered by default.

4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ It supports vibrational (**FT-NIR, NIR, MIR, Raman, UV-Vis**), luminescence
IMS**) data, through a guided bilingual terminal interface (**GUARACI**) and a
Streamlit web app — no coding required.

Originally built for an undergraduate thesis (Chemistry, UFPA) on Amazonian
Originally built for an undergraduate thesis in Chemistry on Amazonian
vegetable oils measured by FT-NIR on an **ABB MB3600** (JCAMP-DX `.dx` files),
now generalized to other analytical techniques and matrices.

Expand Down Expand Up @@ -162,7 +162,7 @@ after export.

## Author

**Erley S. da Costa** — Researcher / Developer · GEAAp/UFPA
**Erley S. da Costa** — Researcher / Developer
[GitHub](https://github.com/ErleySC) ·
[Lattes](http://lattes.cnpq.br/5755582193284309) ·
erleysdacosta@gmail.com
Expand Down
4 changes: 2 additions & 2 deletions README.pt-br.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ Suporta dados vibracionais (**FT-NIR, NIR, MIR, Raman, UV-Vis**), de luminescên
IMS**), por uma interface de terminal bilíngue (**GUARACI**) e um app Streamlit —
sem precisar programar.

Originalmente desenvolvido como Trabalho de Conclusão de Curso (Química, UFPA)
Originalmente desenvolvido como Trabalho de Conclusão de Curso em Química
sobre óleos amazônicos medidos por FT-NIR em **ABB MB3600** (arquivos **JCAMP-DX
`.dx`**), agora generalizado para outras técnicas e matrizes.

Expand Down Expand Up @@ -231,7 +231,7 @@ depois de exportado.

## Autor

**Erley S. da Costa** — Pesquisador / Desenvolvedor · GEAAp/UFPA
**Erley S. da Costa** — Pesquisador / Desenvolvedor
[GitHub](https://github.com/ErleySC) ·
[Lattes](http://lattes.cnpq.br/5755582193284309) ·
erleysdacosta@gmail.com
Expand Down
18 changes: 15 additions & 3 deletions SECURITY.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,21 @@ rodar um programa desconhecido** no seu computador.
é **bloqueado antes de o pickle executar**, não apenas avisado depois.
3. **Deploy público** (Streamlit Community Cloud ou similar): o operador
pode definir a variável de ambiente `GUARACI_DISABLE_MODEL_UPLOAD=1`
para desabilitar completamente o upload de arquivo `.joblib` pela
interface web, aceitando apenas caminhos locais controlados pelo próprio
operador do servidor.
para desabilitar completamente o carregamento de modelo pela interface
web — **isso desliga tanto o uploader de `.joblib` quanto o campo de
caminho local** (corrigido em 2026-08-07: um campo de texto num app web
público nunca é "só o operador digita", qualquer visitante alcança;
antes só o uploader era desligado, e o campo de caminho local sozinho
já bastava para contornar a proteção — ver
`docs/auditoria/AUDITORIA_SEGURANCA_2026-08-07.md`, achado S1). Com a
flag ativa, a aba de Predição não carrega nenhum modelo pela web —
rode a CLI localmente para prever amostras nesse modo.
4. **Uploads isolados por sessão**: quando o carregamento de modelo está
habilitado, cada visitante grava seu upload numa subpasta temporária
própria (identificador aleatório, nunca exposto ao cliente), não mais
um caminho fixo compartilhado entre todas as sessões — fecha uma
condição de corrida entre usuários concorrentes e remove o caminho
previsível que o achado S1 explorava (ver mesmo relatório, achado S2).

### O que isso NÃO resolve

Expand Down
Loading