Why ChatGPT Gets Your Saju Wrong
By Saju Unni · Updated October 6, 2026 · 9 min read
ChatGPT gets saju charts wrong for a boring reason: three of the four pillars are decided by instants, not dates. The saju year opens at the Ipchun moment, the saju month opens at a solar term, and the hour branch is measured in solar time at your birth place. A model answering from memory has none of those numbers in front of it, so it rounds, and the rounding is invisible.
Below are worked boundary cases from the engine that runs this site, and then a measured comparison: the same ten births, put to a GPT model one session at a time.
Three invisible switches
Nothing about a saju chart is vague. The eight characters follow from the birth moment by fixed rules. The difficulty is that three of those rules reference a precise instant, and the instant is not written on anyone's birth certificate.
- Ipchun (입춘, 立春) opens the saju year. It falls around February 3 or 4, at a different minute every year.
- Twelve solar terms open the twelve saju months. None of them land on the first of a calendar month.
- Solar time at the birth longitude sets the two-hour hour branch, after the civil time zone and any daylight saving in force that day are unwound.
Get any one of them wrong and the chart is somebody else's. Here is each, with real numbers.
1. The year pillar turns on Ipchun
Three pairs of births, each pair straddling the Ipchun instant for that year. Every row is computed by this site's engine from its solar-term table.
| Birth (local clock) | City | Ipchun (local) | Offset | Year | Month | Day | Hour |
|---|---|---|---|---|---|---|---|
| 2026-02-04 04:22 | Seoul | 2026-02-04 05:02 | −40 min | 乙巳 | 己丑 | 己酉 | 丙寅 |
| 2026-02-04 05:22 | Seoul | 2026-02-04 05:02 | +20 min | 丙午 | 庚寅 | 己酉 | 丙寅 |
| 1995-02-04 15:33 | Seoul | 1995-02-04 16:13 | −40 min | 甲戌 | 丁丑 | 丙寅 | 乙未 |
| 1995-02-04 16:33 | Seoul | 1995-02-04 16:13 | +20 min | 乙亥 | 戊寅 | 丙寅 | 丙申 |
| 1990-02-03 17:34 | Los Angeles | 1990-02-03 18:14 | −40 min | 己巳 | 丁丑 | 己亥 | 癸酉 |
| 1990-02-03 18:34 | Los Angeles | 1990-02-03 18:14 | +20 min | 庚午 | 戊寅 | 己亥 | 癸酉 |
Read any pair as two people in the same maternity ward an hour apart. Same calendar date, same city, and a different year pillar and month pillar each time. The 1990 pair also shows that Ipchun is an absolute instant, not a Korean local event: in Los Angeles it lands on February 3, in the evening.
Notice what does not move. The day pillar is identical within each pair, and so is the hour pillar in two of the three. The boundary only touches what the boundary governs, which is why the error is so easy to miss: four fifths of the answer still looks right.
2. The month pillar turns on solar terms
Same mechanism, twelve times a year. Gyeongchip (경칩, 驚蟄) opened the 卯 month of 1995 at 10:16 Seoul time on March 6.
| Birth (local clock) | City | Term (local) | Offset | Year | Month | Day | Hour |
|---|---|---|---|---|---|---|---|
| 1995-03-06 09:36 | Seoul | 1995-03-06 10:16 | −40 min | 乙亥 | 戊寅 | 丙申 | 壬辰 |
| 1995-03-06 10:36 | Seoul | 1995-03-06 10:16 | +20 min | 乙亥 | 己卯 | 丙申 | 癸巳 |
Both births are on March 6. One sits in the 寅 month, the other in 卯. Any method that works from "born in March" cannot produce this distinction, and a date-granularity lookup table cannot either — you need the term's minute.
The month stem has a second trap on top of the branch. It is derived from the year stem by a fixed rule (오호둔, 五虎遁), so a wrong year pillar propagates into the month stem even when the month branch happens to be right.
3. The hour pillar is solar time, not clock time
Two more cases. Here the comparison is not before-and-after a boundary but our engine against the shortcut.
| Birth (local clock) | City | Engine hour pillar | Shortcut | Shortcut hour pillar |
|---|---|---|---|---|
| 1992-07-14 13:10 | Seoul | 甲午 | clock time taken as-is | 乙未 |
| 1988-08-15 10:30 | Seoul | 甲辰 | fixed UTC+9, 1988 daylight saving ignored | 乙巳 |
The first is longitude. Korea keeps its clocks on the 135°E standard meridian, and Seoul sits at 126.98°E, so true solar time in Seoul runs roughly half an hour behind the clock. Our engine resolves that 13:10 birth to 12:32 solar time, which sits in the 午 branch rather than 未.
The second is daylight saving, and it is the one almost nothing handles. South Korea observed daylight saving in 1987 and 1988 only. In August 1988 Seoul was on UTC+10, so that 10:30 clock reading resolves to 08:54 solar time — an hour earlier than a fixed UTC+9 assumption would give. The branch moves, and because the hour stem is derived from the day stem and the hour branch together, both characters of the pillar change.
The honest treatment of an unknown birth time is the same principle: leave the hour pillar unknown rather than guessing. A guessed midnight is the worst possible guess, because 23:00 is where the saju day rolls over.
What we measured
We put the same ten births to a GPT model, one independent session per birth, and compared its answer to the engine output above.
Method, so you can judge it: the model was gpt-5.6-sol, reached through the OpenAI codex CLI (codex exec, version 0.154.0) on a ChatGPT login, in October 2026. Each case ran in a fresh session, so no case could see another. Every prompt was one line — birth date, clock time, city, and a request for the four pillars as Chinese characters and nothing else. We ran two arms of ten: one where the model was free to run code, and one where the prompt forbade it. The model ran no code in either arm, and the two arms returned identical answers on all ten cases.
Results, out of ten:
| Count | |
|---|---|
| All four pillars matched | 3 |
| At least one pillar differed | 7 |
| Day pillar matched | 10 |
| Hour pillar differed | 5 |
| Month pillar differed | 2 |
| Year pillar differed | 1 |
Two different things are inside that 7, and they deserve to be separated.
Five of the seven differ only in the hour pillar, and every one is the solar-time correction. The model used the wall clock; our engine converts to solar time at the birth longitude first, which is standard Korean practice and what the 1992 and 1988 rows above are about. That is a convention our engine applies and the model does not, so call it a convention gap rather than a mistake in arithmetic. It still changes two of the eight characters in half the cases, and nothing in the model's answer tells you a choice was made.
Two of the seven are arithmetic. In the 1990-02-03 17:34 Los Angeles case the model returned 乙丑 for the month pillar where the rule gives 丁丑 — the right branch with the wrong stem, because the month stem is derived from the year stem by a fixed table. And in the 1990-02-03 18:34 case, a birth twenty minutes after Ipchun, the model returned the pillars for before it: 己巳 instead of 庚午 for the year, and the month pillar followed the error down. That is the failure this whole article is about, caught in the open.
The day pillar matched ten times out of ten, which fits the mechanism: the day cycle is a plain count with no boundary instant in it, so there is nothing to round.
Two honest caveats. Ten cases is a small sample, and it is deliberately adversarial — every case was built to sit near a boundary, because that is where the method breaks and where "my birthday is in early February" people actually live. A set of mid-month, mid-afternoon births would score far better. What the sample does establish is that near a boundary the model does not hedge, does not flag the birth as a close call, and returns the same confident eight characters either way.
The full log, with every prompt and every raw answer, is docs/geo/gpt-pillar-test-2026-10-06.json in our repository.
So what should you actually do
Split the work along the line the work already has.
- Calculate with a calendar. Solar-term table, time zone history, longitude, the 23:00 day boundary. This part has one right answer and no interpretation in it.
- Interpret with language. Once the eight characters are fixed, a model is a good study partner: it explains the day master, compares elements, and answers the follow-up you actually had.
Our ChatGPT saju prompt page does the first half and hands you a prompt containing your pillars plus an instruction not to recalculate them. The prompt itself, line by line explains why each part of it is there, and can ChatGPT read your saju covers where the model is genuinely strong.
Reproduce it
Everything above is generated, not typed. The boundary cases come from scripts/ipchun-boundary-cases.mjs in our codebase: it reads the solar-term table, builds births at fixed offsets from each boundary, and runs them through the same engine the site uses. The GPT comparison comes from scripts/gpt-pillar-test.mjs, which replays those cases through separate sessions and records every answer.
If you want the mechanics of the calculation itself rather than its failure modes, how a saju chart is calculated walks through the steps, and what is saju is the starting point for the system as a whole.
FAQ
- Is a ChatGPT saju reading accurate?
- The interpretation can be good. The arithmetic underneath is the weak point: in our ten-case boundary comparison (gpt-5.6-sol, October 2026) the model matched our calendar engine on all four pillars three times out of ten. Five of the seven misses were the hour pillar and two were year or month arithmetic.
- What is Ipchun and why does it change my year pillar?
- Ipchun is the solar term that opens the saju year, around February 3 or 4. The exact instant moves every year, down to the minute. A birth an hour earlier or later than that instant belongs to a different year pillar, and the month pillar usually moves with it.
- Why do saju months not match calendar months?
- A saju month starts at a solar term, not on the first of the month. The twelve boundaries each land at a calculated minute, so two people born on the same civil date can hold different month pillars if the term fell between their births.
- Does my birth city change my chart?
- It can change the hour pillar. The hour branch follows solar time at the birth longitude, and the time zone and any daylight saving in force on that date have to be unwound first. Both corrections can push a birth across a two-hour branch boundary.
- So should I not use AI for saju at all?
- Use it for the part it is good at. Let a calendar engine fix the eight characters, then let the model explain them, compare them, and answer your follow-ups. The split is calculate first, interpret second.