How is compatibility (궁합) actually calculated?

Three lookups against real charts — from the code, not a fortune line.

The short answer

Give Bokki two birth dates and it runs the same three lookups every time. Your two birth-year elements are set against a five-element chart. Your two day-master elements — the stem Saju reads as “you,” not “your year” — are set against the same chart. Your two zodiac animals are set against a trine-and-clash table. That's the whole engine: no dice, no cards, no free-text prompt to an AI. computeCompatibility(a, b, locale) takes two already-computed charts and returns exactly five things — a four-tier label plus three short paragraphs of prose. It never returns a percentage, because it never keeps one.

Three lookups, not one verdict

Two of the three lookups reuse the same five-element wheel Bokki's own 용신 (favorable-element) engine runs: around the rim, Wood feeds Fire, Fire feeds Earth, Earth feeds Metal, Metal feeds Water, Water feeds Wood (相生, generating); across the middle, Wood breaks Earth, Earth dams Water, Water quenches Fire, Fire melts Metal, Metal cuts Wood (相剋, restraining). compatibility.ts keeps its own copy of that table rather than importing analysis.ts's, but the values match exactly. The first lookup applies this wheel to each person's birth-year stem element; the second applies the identical wheel to each person's day-master element — a different character in the same chart, and the one Saju treats as the true self. The third lookup is unrelated to the wheel: the two zodiac animals (year branch) checked against four three-way trine groups (Rat–Dragon–Monkey, Ox–Snake–Rooster, Tiger–Horse–Dog, Rabbit–Goat–Pig) and six direct-opposite clash pairs.

How the five elements generate and restrain each otherThe five elements sit on a pentagon. Around the rim runs the generating cycle: Wood feeds Fire, Fire makes Earth, Earth yields Metal, Metal carries Water, Water grows Wood. Across the middle runs the controlling cycle as a five-pointed star: Wood breaks Earth, Earth dams Water, Water quenches Fire, Fire melts Metal, Metal cuts Wood. Your day master sits at one of these five points, so today's element always arrives as one of these relationships — feeding you, draining you, controlled by you, controlling you, or the same as you. Those two cycles are the whole grammar of a reading.WoodFireEarthMetalWatergenerates →restrains →
A worked example — the same two people, three different answers

Take two real birth dates: 2 November 1988 (year pillar 戊辰, a yang-Earth Dragon) and 8 June 1996 (year pillar 丙子, a yang-Fire Rat). Lookup one, birth-year elements: Fire feeds Earth, so the 1996 chart's Fire generates the 1988 chart's Earth — a “gen” match. Lookup two, zodiac: Dragon and Rat both sit in the Rat–Dragon–Monkey trine — an instinctive match. Lookup three, day masters: the 1988 chart's day stem is 辛 (yin Metal), the 1996 chart's is 丙 (yang Fire), and Fire controls Metal — a “ctrl” match, friction rather than ease. Same two people, three separate reads: warm, warm, and tested. Run the internal tally by hand and it shows why the label still lands warm — base 58, +14 for the generating elements, +20 for the trine, −6 for the controlling day masters, landing at 86, which crosses the ≥85 line into golden (“A rare match” on screen). One tense axis does not outvote two easy ones; it just means this pair would do well to expect the day-to-day friction to sit specifically between who they each are underneath, not in the outer rhythm of the relationship.

Where the number goes to die

That 86 above is real — it is what compatibility.ts actually computes for those two dates, and we had to reconstruct it by hand to write this paragraph, because Bokki has never shown it to anyone. The function clamps the running total to 38–98 and sorts it into one of four bands, and only the band's name ever reaches the screen: ≥85 is “golden” (“A rare match” / 귀한 인연), ≥70 is “warm” (“Warm and well-matched” / 따뜻이 잘 맞는), ≥55 is “tending” (“A bond worth tending” / 가꿀 만한 인연), and anything lower is “opposites” (“Opposites that teach” / 서로를 가르치는). The return type has no field for the number that decided which of the four you got. That is not an oversight — the type declaration is commented “NOT a score (D-003: no numbers/%)” in Bokki's own source. We could show you a percentage. The code above proves we compute something close to one internally. We show you a sentence instead, on purpose, every time.

What we don't calculate

No percentage or score ever reaches the screen, in any locale — see above; the number exists for one line inside one function and dies there. No probability that the relationship lasts, and no verdict on whether to stay together or walk away; that is not a Saju question, and Bokki will not manufacture an answer to it. No reading of the other person's private feelings — that is a different tool with a different boundary, at /heart, and compatibility.ts never imports it. And no deeper classical layers some 궁합 traditions add on top of the three lookups above: no 납음오행 (nayin sound-element) table, no comparison of the month or hour pillars, no 원진살, 귀문관살, or the other clash-adjacent 신살 some schools use to warn a couple apart. Bokki runs three plain lookups and stops exactly there.

← Get my reading

Read next

Check your own compatibility →
What is Saju? — the four pillars, explained
용신 (yongsin) — the same five-element wheel, one chart
The Ten Gods (십신) — what the day master means in a chart

Questions people actually ask

Does Bokki give a compatibility percentage?

No. computeCompatibility() clamps an internal running score to 38-98 and sorts it into one of four labels (golden/warm/tending/opposites), but that number is never part of the return value and never reaches the screen. The type declaration is commented “NOT a score (D-003: no numbers/%)” in Bokki's own source.

What exactly does Bokki compare between two birth dates?

Three separate lookups: each person's birth-year stem element against a five-element generating/restraining wheel, each person's day-master element (a different character in the same chart) against the same wheel, and each person's zodiac animal against a trine-and-clash table. The three can disagree — our worked example (1988-11-02 and 1996-06-08) is generating on one axis, a trine on another, and restraining on the third, yet still lands on “golden” overall.

Can a compatibility reading predict whether we'll stay together?

No, and Bokki will not manufacture that answer. The engine reads three fixed relationships between two charts; it has no function that outputs a probability of a relationship lasting or a verdict on whether to stay or leave.

Does Bokki know how the other person feels about me?

No. compatibility.ts never imports heart.ts, and nothing in the compatibility engine reads or guesses feelings. Reading someone's heart, with its own separate boundary, lives at a different tool (/heart).

Is a restraining (相剋) or clashing (沖) result a bad sign?

No — Bokki frames every result warmly, including this one. A restraining or clashing axis is read as friction that sharpens both people or teaches patience, never as doom. Two of the three lookups being easy does not get cancelled out by the third being tested; it just names where the work is.