FIR — Fractional Information Runtime
PROJECT_STATUS_COMPLETE.md, MANIFEST.md e DEVELOPER_QUICK_REFERENCE.md — todos datados de 2026-08-13 — descrevem o projeto como "Fase 1.5 completa, pronto para Fase 2" (VM ainda por construir). Mas o código-fonte já contém a Fase 2 inteira (VM, bytecode, compilador) e duas camadas inteiras não documentadas nesses arquivos de status: uma AI Engine e um Research Engine autônomo de pesquisa matemática. Rodei a suíte de testes agora:
Isso importa porque qualquer plano futuro — inclusive um gerado por outra sessão de IA — que parta só da leitura desses três arquivos vai replanejar trabalho que já existe. A primeira coisa a fazer é atualizar os documentos de status, não o código.
| Camada | Diretório | Status real |
|---|---|---|
| Core (MU types, operações, serializer, canonicalizer) | src/core/ | implementado + testado |
| VM (bytecode, assembler, disassembler, executor, compiler) | src/vm/ | implementado + testado |
| AI Engine (tools, knowledge base, context builder) | src/ai/*.cpp | implementado + testado |
| Research Engine (conjecturas, contraexemplos, lemas) | src/ai/research_*.cpp | implementado + testado |
| LLM real (OpenAI/Anthropic) | src/ai/llm_client.cpp | só stub — sem HTTP real |
Busquei por TODO, stub, placeholder e not implemented em src/. O que sobrou depois de filtrar comentários cosméticos:
| Onde | O quê |
|---|---|
| ai/llm_client.h / .cpp | Só existe StubLLMClient. Os docs (docs/AI_ENGINE.md) descrevem FIR_LLM_PROVIDER=openai|anthropic como se funcionasse — não funciona ainda. |
| ai/ai_engine.cpp:11 | Construtor sempre instancia StubLLMClient, ignora a env var mencionada na doc. |
| core/operations.cpp:205-208 | MEXPAND_PARTIAL retorna vetor vazio — não implementado. |
| core/operations.cpp:222 | benchmark() genérico retorna "Not implemented" (baixa prioridade — os programas bench_*.cpp já cobrem isso separadamente). |
| vm/compiler.cpp:195, 271 | Codegen de LOG e de MU_REFERENCE emite placeholder em vez de bytecode real. |
| core/structural_hash.cpp:150 | Hashing de operações comutativas é um placeholder — a normalização real fica só no canonicalizer. |
Some-se a isso as duas limitações já autodocumentadas em PHASE_1_5_ANALYSIS.md e nunca fechadas:
detecção de equivalência canônica (2^100 == 4^50 não é reconhecido) e crescimento linear de cadeias de operações acima de ~1000 passos.
OpenAIClient / AnthropicClient em llm_client.cpp (cliente HTTP mínimo — libcurl no Linux/VM, WinHTTP no Windows local) lendo a chave de API das env vars já documentadas.FIR_LLM_PROVIDER em vez de instanciar StubLLMClient direto.2^100 == 4^50) no canonicalizer.MEXPAND_PARTIAL — necessário para qualquer CLI/UI que queira pré-visualizar valores estruturais grandes sem expansão total.LOG e MU_REFERENCE em vm/compiler.cpp para que programas DSL usando log() ou referências entre MUs compilem para bytecode real.C: da máquina de desenvolvimento está em 0 bytes livres — já quebrou chamadas de shell durante esta análise. Vai travar builds/IDE em algum momento próximo se não for liberado espaço.Fase A vem antes de tudo porque qualquer trabalho novo — feito por você ou por outra sessão de IA — que ignore o estado real do código vai perder tempo replanejando o que já existe. Fase B é a de maior valor novo (é o que realmente diferencia o Research Engine). Fases C e D são endurecimento de corretude sobre o que já está construído. Fase E não é urgente, mas é relógio correndo: disco cheio e ausência de git são os dois jeitos mais prováveis de perder trabalho por acidente.