factcircuit
FactCircuit는 불변 출처와 단계별 검증, 제한된 검색, 재현 가능한 평가를 제공하는 감사 가능한 주장·증거 검증 루프입니다
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Plataforma web de apoio à seleção de materiais de engenharia inspirada na metodologia de Michael Ashby (mapas de propriedades e índices de desempenho). Projeto de Trabalho de Conclusão de Curso em Engenharia de Materiais (UFRGS). ⚠️ Dados exclusivamente demonstrativos. Não utilizar em projetos reais. Os materiais e valores incluídos são fictícios, criados apenas para exercitar o sistema.README 전문 보기 ↗
Plataforma web para ensinar e praticar a seleção de materiais de engenharia pelo método de Michael Ashby — mapas de propriedades, índices de desempenho e seleção em etapas. Trabalho de Conclusão de Curso em Engenharia de Materiais (UFRGS).
A contribuição não é um catálogo de materiais: é tornar o método reprodutível e auditável. Todo número que aparece na tela ou num documento exportado sai de um cálculo determinístico do backend, com a trilha de onde veio. A IA interpreta, sugere e explica — e nunca produz um número.
Os dados de demonstração são fictícios e ficam marcados no banco (
is_demo). A interface e as exportações não trazem mais aviso sobre isso nem sobre limite de uso (D-138).
No ar: frontend em https://material-select-ai-web.vercel.app (login pelo
Google). Estado detalhado em docs/PROJECT_CONTEXT.md.
Estudar
Seleção — um assistente guiado, um passo de cada vez: Função → Objetivo → Restrições → Resultados. Por trás, a seleção é uma pilha de estágios (limites com AND/OR aninhados, árvore de classes, processo compatível, região de um gráfico), e o resultado é a interseção deles. Um limite pode pedir nível mínimo aceito numa propriedade ordinal (escala do pior ao melhor, como durabilidade por agente; material sem nível nunca passa). Ranking por soma ponderada, TOPSIS ou PROMETHEE II, pesos por AHP, funil de eliminação, excluídos por dado ausente e análise de sensibilidade. Estudos salvos reexecutam para a mesma resposta, levam notas por estágio e por estudo, e saem como arquivo JSON versionado que outra pessoa importa (o arquivo é só dado: nada nele é executado). A tabela de resultado se copia como TSV, e um registro próprio se duplica como cópia editável.
Busca global e desfazer — a barra do topo (Ctrl/Cmd+K ou /) leva a qualquer tela, material, processo, caderno ou
estudo salvo, e só navega. Excluir um estudo, uma fonte, uma nota ou um caderno mostra um aviso com
Desfazer (o servidor só apaga quando o aviso vence). A tabela do catálogo ordena por material ou
classe e permite marcar linhas para Comparar selecionados. A página inicial cumprimenta pelo nome e
mostra Vistos recentemente, os últimos materiais e processos abertos.
Mapas — mapas de Ashby com escala log, envelopes por classe e linhas de
índice cuja inclinação é derivada da própria expressão (E/ρ → 1,
E^(1/2)/ρ → 2). Um eixo pode ser uma propriedade ou um índice.
Comparar — tabela com proveniência de cada valor, gráficos, busca de materiais semelhantes a uma referência, com peso e critério por propriedade e uma tolerância de ±x% ("dentro da faixa" conta como igual), geral ou própria de cada propriedade, e índices calculados (os do catálogo ou uma expressão digitada, validada e calculada no servidor, com a coluna marcada como "Calculada").
Cadernos — o NotebookLM dentro do app: cadernos privados com fontes próprias (PDF, DOCX, TXT, MD, texto colado, ficha de material, estudo salvo) e fontes externas (link de site, vídeo do YouTube com a transcrição colada, Wikipédia, artigos da OpenAlex, busca na web). Conversa com citação por trecho e um Estúdio que gera, a partir das fontes:
Todo número de uma resposta ou de um item tem de estar no trecho que ele cita, e todo arquivo exportado leva as referências.
Ferramentas
fator estrutural / índice, e o objetivo custo reaproveita
a mesma derivação.Dados
/app/glossario/familias) traz uma nota conceitual por
família de materiais — o que ela é, por que se comporta assim, quando escolher
e o que conferir —, que também aparece dobrada na ficha do material, sob a classe, e na página da
família (/app/catalogo/{slug}).comp:Cr>=12,
comp:Ni:8-10, norma:UNS e designacao:S30400 se combinam com AND/OR/NOT;
a faixa de composição é lida por alcance, material sem o dado não passa e a
busca diz quantos ficaram de fora. A ficha mostra composição (% em massa, com
fonte) e designações (D-105), com a equivalência entre designações
declarada por fonte (D-115), nunca inferida./app/catalogo/releases (link discreto no
catálogo), duas releases do mesmo catálogo oficial lado a lado: contagem de
registros novos, alterados, desativados e inalterados, filtros por situação e
classe, lista paginada e, por registro, cada campo "antes → depois" com a
unidade e a natureza da mudança — valor, presença do dado, ou só a escrita da
fonte (mesmo valor físico em outra unidade). Dado que apareceu ou sumiu é
escrito por extenso ("declarado ausente pela fonte", "não cadastrado nesta
release"), nunca como 0. Releases, filtros e registro aberto vivem na URL;
CSV/XLSX no "Exportar ▾". O backend compara e converte; a tela só mostra
(D-108). O seed demo traz duas versões de exemplo para ver tudo isso.Documentos — CSV, XLSX e HTML imprimível do catálogo e de cada estudo; o
laudo de engenharia de um estudo, com mapa de seleção e gráfico de ranking
desenhados no backend; e o cartão de material para CAE de cada material
(Ansys MAPDL, Abaqus, Nastran MAT1, LS-DYNA *MAT_ELASTIC e MatML 3.1, mais
os cartões térmicos e os elastoplásticos com a curva e a série que o usuário
escolhe), no sistema de unidades que o usuário escolhe, com propriedade não
cadastrada omitida e nunca zerada (docs/10-relatorios.md, D-104).
São o que sustenta a alegação de que a seleção é reprodutível. Detalhe e
motivo de cada um em CLAUDE.md e docs/CLAUDE.md.
is_missing=True, campos
NULL), nem na tela, onde ela tem rótulo escrito..env.example.is_demo) e criados ou apagados só
pelo caminho de docs/15-dados-demonstrativos.md.Monorepo com backend e frontend desacoplados e um contrato de tipos único:
| Pasta | O quê |
|---|---|
apps/api | FastAPI, SQLAlchemy 2.0, Alembic, Pydantic v2, Pint. SQLite em desenvolvimento e nos testes; PostgreSQL em produção. |
apps/web | Next.js 16 (App Router, build com --webpack), React 18, TypeScript estrito, Tailwind, TanStack Query. Sistema de design próprio (MSDS), sem biblioteca de componentes; Plotly só para os mapas. |
packages/shared-types | O contrato de tipos canônico, importado por apps/web via npm workspace. |
docs/ | Documentação, decisões (DECISIONS.md) e ADRs. |
No backend o fluxo é routers (HTTP fino) → services (regras e orquestração)
→ repositories (único acesso ao banco, sempre parametrizado) → models.
Regras puras em domain, cálculo em calculations, e ainda importers,
exporters, ai, knowledge, notebooks e integrations (a única porta de
saída para a rede, por safe_fetch.py). Visão completa em
docs/ARCHITECTURE.md.
Pré-requisitos: Python 3.11+, Node.js com npm (a CI usa Node 22) e git.
# Windows / PowerShell
cd apps\api
python -m venv .venv
.\.venv\Scripts\Activate.ps1
pip install -e ".[dev]" # extras: postgres, billing, ai, knowledge
copy .env.example .env
python -m alembic upgrade head
python -m app.db.seed # base de demonstração
python -m app.db.seed_extended # opcional: os 70 materiais de exercício + designação, composição e curva dos 75
python -m app.db.demo_coverage # quem tem (e quem não tem) designação, composição e curva
uvicorn app.main:app --reload # http://localhost:8000/docs
# Linux / macOS
cd apps/api
python -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"
cp .env.example .env
python -m alembic upgrade head
python -m app.db.seed
python -m app.db.seed_extended
uvicorn app.main:app --reload
cd apps\web # bash: cd apps/web
npm install
copy .env.local.example .env.local # bash: cp .env.local.example .env.local
npm run dev # http://localhost:3000
Atalhos para Windows em scripts/: seed.ps1, dev-api.ps1,
dev-web.ps1.
Login. Toda tela da ferramenta exige login pelo Google — não existe senha
em lugar nenhum do sistema. Para entrar localmente, crie um cliente OAuth e
preencha GOOGLE_CLIENT_ID/GOOGLE_CLIENT_SECRET e SESSION_COOKIE_SECURE=false
no apps/api/.env (o passo a passo está comentado no próprio .env.example).
Depois, ou use ACCESS_MODE=open, ou conceda a assinatura à sua conta com
python -m app.admin.grant_subscription --email [email protected].
cd apps\api; .\.venv\Scripts\Activate.ps1 # bash: source .venv/bin/activate
ruff check app; black --check app; pytest
cd apps\web
npm run typecheck; npm run lint; npm run test; npm run build
npm run test:e2e # Playwright, API e banco próprios
Os testes do backend rodam em SQLite em memória e não têm rede — o
conftest.py reprova quem tentar sair. Pelo último registro em
docs/PROJECT_CONTEXT.md, são 4079 testes de backend e 797 de frontend.
.github/workflows/ci.yml roda em todo PR e em
todo push para main: Backend (Python 3.11 e 3.12: ruff, black, pytest com
serviço PostgreSQL e SQLite em memória, migrações e seed num banco limpo),
Migrações (PostgreSQL) (com testes de concorrência multithread de cotas),
Frontend (typecheck, lint, test, build), E2E (Playwright) e
Lighthouse. Nenhum passo é informativo; os checks obrigatórios impedem o
merge.
| Peça | Onde |
|---|---|
| Frontend | Vercel — publica sozinho a cada push em main |
| API | Fly.io — release_command aplica as migrações antes do tráfego |
| Postgres | Neon |
A API é servida pela origem do frontend (rewrites() no
next.config.mjs): com …vercel.app chamando …fly.dev direto, o cookie de
sessão SameSite=Lax não viajaria e o login entraria em laço sem erro em log
nenhum.
Mesclar um PR não implanta a API nem semeia o banco. As operações são workflows de disparo manual na aba Actions:
| Workflow | Quando |
|---|---|
Deploy da API (deploy-api.yml) | Depois de todo merge que toque apps/api/**. |
Administração do banco (admin-banco.yml) | semear_referencia para referência real; semear_demo somente para ambiente fictício; também migrar, excluir_demo, catalogo_oficial_validar, catalogo_oficial_importar, conceder e revogar. |
Provedor de IA (provedor-ia.yml) | Trocar a IA (gemini, groq, mock); confere em /api/health. |
Modo de acesso (modo-acesso.yml) | abrir para uma turma, restaurar_assinatura depois. |
Base de conhecimento (Cérebro) (conhecimento.yml) | ingerir depois de um PR que mexa em Cérebro/ ou no manifesto — baixa do LFS só o que o banco ainda não tem (com arquivos: Links.md, só ele, sem baixar nada); embeddings para gerar vetores já; status para o retrato. Uma execução noturna agendada gera os vetores sozinha, com a sobra da cota gratuita (até 1000 pedidos), e nunca envia trecho de documento da lista de remoção. |
Roteiro completo, com o porquê de cada passo, em
docs/13-deploy.md.
mock: determinístico, sem rede e
sem chave. AI_PROVIDER= (vazio) desliga a camada, e o resto do sistema
funciona igual.openai-compat. A chave sai de um projeto sem faturamento: ao
passar do limite a API responde 429, nunca cobra. Nunca ligue o
faturamento — nem crédito promocional.speechSynthesis), sem TTS pago — por isso não há MP3 nem MP4 para baixar,
só o roteiro e o deck. As vozes em português dependem do sistema do aluno; a
tela avisa quando não há voz pt-BR e a transcrição continua lá.Links.md)
junta busca por palavras (BM25) e por vetores do gemini-embedding-001 com
768 dimensões, gerados à noite com a sobra da cota gratuita. Esgotada a
cota, a busca cai para as palavras, sem erro na tela. No plano gratuito o
Google pode usar o texto enviado — o autor aceitou isso para os livros do
Cérebro (D-101).claude-api, claude-cli, Groq, Ollama local) são troca
de variável; serviço, guardrails e interface não mudam.Detalhes em docs/09-camada-ia.md e
docs/13-deploy.md §5-quinquies e §5-sexies.
Todo PR atualiza, no mesmo PR, o texto que a mudança tornou falso: este
README, as decisões, o backlog, o registro de sessão e o documento da área
tocada. PR sem isso está incompleto — a regra completa está em
docs/CLAUDE.md §9, e o modelo de PR em
.github/pull_request_template.md.
Leia AGENTS.md antes de escrever qualquer código: ele dá a ordem
de leitura obrigatória. As regras vivem em CLAUDE.md e
docs/CLAUDE.md; os arquivos de instrução de cada ferramenta
(GEMINI.md, .cursor/rules/, .github/copilot-instructions.md,
.windsurf/rules/, .clinerules/, .agent/rules/, .rules,
CONVENTIONS.md) apenas apontam para eles.
Comece por docs/PROJECT_CONTEXT.md.
| Documento | Para quê |
|---|---|
docs/PROJECT_CONTEXT.md | Estado do projeto, o que falta, riscos. |
docs/CLAUDE.md | Guia de desenvolvimento: regras, armadilhas, o que não alterar. |
docs/REGRAS_POR_AREA.md · docs/ESTADO_ATUAL.md | Regras operacionais por área; histórico narrativo detalhado. |
docs/ARCHITECTURE.md | Módulos, dados, APIs, banco. |
docs/DECISIONS.md · docs/adr/ | Por que foi decidido assim, com as alternativas. |
docs/TODO.md | Backlog priorizado. |
docs/CHANGELOG_SESSION.md | O que mudou em cada sessão. |
docs/01-visao-geral.md · |
MIT — ver LICENSE.
docs/18-catalogo-oficial-granta.md. Fontes abertas (Materials Project, Wikidata, JARVIS…) entram pelo mesmo pipeline, só com veredito APROVADA no portão de licença — docs/20-catalogo-fontes-abertas.md e docs/catalogo/fontes.md; nenhuma está aprovada ainda.04| Problema e metodologia de Ashby. |
docs/03-modelo-de-dados.md · 05 | Modelo de dados; unidades e proveniência. |
docs/06-importacao.md | Importação e segurança. |
docs/07-selecao-deterministica.md | Estágios, índices, ranking. |
docs/08-visualizacao.md | Mapas, linhas de índice, comparador. |
docs/09-camada-ia.md | Camada de IA, guardrails, Cadernos, o Estúdio e as fontes externas. |
docs/10-relatorios.md | Exportação, relatório e laudo. |
docs/11-usabilidade.md | Instrumento do teste com usuários. |
docs/12-estudo-de-caso.md | O tirante leve e rígido, do enunciado ao relatório. |
docs/13-deploy.md | Deploy e operação pelos workflows. |
docs/14-plataforma-selecao.md | Comparação com o modelo funcional do Granta EduPack. |
docs/15-dados-demonstrativos.md | Como criar e apagar dado fictício. |
docs/18-catalogo-oficial-granta.md | Pipeline, identidade, bundle e cutover do catálogo oficial licenciado. |
docs/19-inventario-instalacao-granta.md | Inventário auditado dos bancos, ProductConfig, Templates, Attribute Notes, Exporters e módulos da instalação. |
docs/20-catalogo-fontes-abertas.md · docs/catalogo/fontes.md | Portão de licença do catálogo complementar: fontes abertas, bases comerciais recusadas e vereditos por fonte (D-103, rascunho). |