Steve Yegge falou sobre "compressão de insight (Insight Compression)" em "Software Survival 3.0" — a ideia de que Git ou Kubernetes condensam décadas de tentativa e erro, algo que um LLM não consegue reproduzir facilmente. Parti da sensação de que a astrologia saju myeongri é parecida.
O que acontece quando você entrega o saju a um LLM
Como muita gente faz hoje em dia, se você coloca dados de saju em um LLM, ele produz um resultado plausível. O problema é a distância entre "plausível" e "correto".
Testei vários modelos, como GPT-5, GPT-4o, Claude e DeepSeek V3, combinando structured output e few-shot. Havia pontos de erro sistemáticos. Por exemplo, em um saju do tipo jongganggyeok (從強格), o modelo aplicava apenas a lógica de eokbu (抑扶) e concluía que fogo (火) era o yongsin. Não foi possível evitar completamente, só com prompts, julgamentos que violavam o princípio clássico "choknogangsin daehyung (觸怒強神 大凶)".
Além disso, havia tendência de ficar ancorado na interpretação de uma escola específica e distorcer o texto original, de embelezar em excesso interpretações negativas ou, ao contrário, amplificar a ansiedade. Deixar o julgamento das regras para o pattern matching de um LLM era um problema da mesma natureza que pedir aritmética a um modelo de linguagem.
Motor Hojak: regras em código, explicação só com LLM
Por isso, projetei uma estrutura em camadas.
Ho (虎) — motor de regras. Implementa em código a lógica de cálculo da myeongri. Após definir, por área, qual interpretação adotar entre as divergências dos 5 grandes clássicos originais (Jeokcheonsu, Japyeongjinjeon, Gungtongbogam, Sammyeongtonghoe e Yeonhaejapyeong), fixei esses critérios no código.
Jak (鵲) — camada de explicação com LLM. O LLM fica responsável apenas por transformar em linguagem natural os dados estruturados calculados pelo motor.
O que era difícil para um LLM reproduzir não era o código, mas os critérios de julgamento refinados ao longo de milhares de anos.
O ponto em que o vibe coding encontrou seu limite
No começo, tudo correu bem. O LLM ajudou rapidamente com análise dos clássicos em chinês clássico, organização das escolas e até rascunhos de código de cálculo astronômico. O limite apareceu nos pontos em que as regras entre escolas entravam em conflito.
Por exemplo, no julgamento de gyeokguk (格局), Jeokcheonsu observa primeiro a força ou fraqueza do ilgan, enquanto Japyeongjinjeon olha primeiro para a projeção do wollnyeong. Em alguns casos, era o mesmo saju, mas o resultado se invertia dependendo de qual clássico se seguisse, e essa prioridade não era algo que um LLM pudesse decidir.
No fim, precisei obter diretamente os 5 textos originais e compará-los. Como havia versões incompletas e trechos ilegíveis, passei por um processo de validação cruzada entre diferentes edições. Descobri que, por ser um esforço de preservação apoiado pelo Estado, havia muito material clássico preservado — e sem ajuda de LLM teria sido um trabalho difícil demais para uma pessoa só. Usei praticamente o limite inteiro do Claude Max x20 por quase 3 meses.
Um ponto interessante é que, na maioria dos casos em que a transcrição do texto original estava errada, o erro vinha dos humanos (acadêmicos). Dependendo de como se lê a frase de Jeokcheonsu, "旺者宜泄, 唯有情有力者可克", o próprio ramo do algoritmo muda; nesse ponto, o LLM foi útil justamente para cruzar e comparar traduções de diferentes estudiosos com anotações do original.
Precisão temporal: 1 minuto muda o julgamento
Na myeongri, uma diferença de 1 minuto no horário pode mudar um julgamento central. Se o pilar horário muda na fronteira entre jasi (子時) e chuksi (丑時), o próprio julgamento de gyeokguk muda.
O motor Hojak combina equação do tempo por série de Fourier baseada na NASA/JPL (precisão de ±13 segundos), julgamento global de DST com base em IANA tzdata e um banco de dados com longitude de mais de 163.400 cidades. No caso da Coreia, ele reflete 4 mudanças de longitude padrão desde 1908 e um histórico de 12 anos de horário de verão.
Pessoalmente, foi marcante encontrar nos registros oficiais do Gwansanggam da dinastia Joseon (Seoungwanji) a mesma fórmula de correção de longitude usada hoje no código.
Estado da validação
O cálculo dos termos solares coincide 100% com os dados oficiais do Instituto Coreano de Pesquisa em Astronomia e Ciências Espaciais (KASI) no intervalo de 2000 a 2050. A equação do tempo alcançou precisão de ±13 segundos com base no NASA/JPL Horizons. Os sinsal correspondem 100% ao calendário manseoryeok ao adotar os doze sinsal ortodoxos (com base em Sammyeongtonghoe), e os gwiinsal e tipos especiais foram classificados e aplicados em 3 níveis — orthodox / disputed / reference — após validação cruzada com os textos originais.
Stack técnica
O motor usa Python FastAPI + PostgreSQL + SQLAlchemy 2.0(async); no front, Next.js 15 + React 19 + TypeScript + Tailwind CSS. A IA usa multmodelos via OpenRouter (GPT-4o, Claude, DeepSeek V3) apenas na camada de explicação. O deploy é Fly.io (Blue-Green) + Vercel, e os pagamentos usam Toss Payments + PayPal.
Atualmente, ele gera relatórios estruturados em escala de mais de 30.000 caracteres para análise de saju palja e mais de 20.000 caracteres para análise anual, e os dados de nascimento são armazenados de forma criptografada.
Encerrando
Há várias visões sobre a validade preditiva da myeongri. Este projeto se concentrou menos nesse debate e mais na tarefa de engenharia de "se vamos usar esse sistema, então vamos calculá-lo de forma consistente e com critérios corretos, de acordo com sua intenção".
Começou como um experimento leve de vibe coding, mas no fim acabei analisando os 5 grandes clássicos originais e até examinando código da equação do tempo da NASA/JPL. Tomando emprestada a expressão de Yegge, a densidade de insight comprimido nesse domínio era muito maior do que eu imaginava.
Perguntas técnicas ou feedback são bem-vindos.
3 comentários
Fiquei um pouco triste porque minha sorte nos grandes ciclos não é muito boa... Em geral, a ordem do destino é hora, dia, mês, ano, mas neste serviço está ao contrário, então isso foi um pouco confuso. A menos que haja alguma intenção específica, que tal mudar para a ordem mais comum?
Conforme você comentou, mudei imediatamente para a ordem correta de hora, dia, mês e ano. Eu estava trabalhando em outras coisas, então só agora consegui agrupar tudo e fazer o deploy. Obrigado.
Analisando, percebi que, na prática, as pessoas que já têm interesse em saju se identificam mais profundamente com o conteúdo e também usam o serviço por mais tempo. No começo, minha ambição de tornar "fácil até para quem não conhece saju" ao mudar a ordem foi um erro de julgamento. Graças ao feedback, consegui corrigir a direção. Mais uma vez, obrigado.
Você tem razão sobre a ordem do arranjo. No início, organizei em ordem cronológica (ano-mês-dia-hora) para que quem não está familiarizado com saju pudesse conferir intuitivamente sua data e hora de nascimento, mas parece que bem mais gente do que eu imaginava já está acostumada com a disposição do saju, e isso acabou gerando confusão.
Como nos textos clássicos originais a ordem padrão também é hora-dia-mês-ano, vou considerar seriamente fazer essa mudança. Foi um feedback realmente necessário,
obrigado pelo feedback!
E você comentou que este não é um período fácil no daewoon, mas na Myeongri o daewoon é o grande fluxo, e dentro dele há as mudanças do sewoon (歲運). Mesmo em um daewoon difícil, o momento de encontrar o yongsin com certeza chega, então espero que você aproveite bem essa oportunidade quando ela vier.